基于角色的访问控制

index.ts
复制

interface User {
  username: string;
  roles: string[];
}

interface Role {
  name: string;
  desc: string;
  permission: Permission[];
}

export enum Permission {
  // 新闻类
  NewsCreate, // 创建新闻
  NewsUpdate, // 更新新闻
  NewsDelete, // 删除新闻
  NewsQuery, // 查询新闻

  // 商户信息
  BusinessInfoUpdate, // 更新商户信息

  // 交易类别
  Buyable, // 是否可以参与购买
  Sellable, // 是否可以参与卖出

  // 用户类
  UserFreeze, // 冻结用户 (用户不能再使用)

  // 钱包类别
  WalletMutation, // 用户钱包的变动

  // 权限类别
  PermissionMutation, // 更新权限的变动

  // 通用类
  Uploadable // 是否可以上传
}

const Roles: Role[] = [
  {
    name: "User",
    desc: "普通用户",
    permission: [
      Permission.NewsQuery,
      Permission.Buyable,
      Permission.Sellable,
      Permission.Uploadable
    ]
  },
  {
    name: "Business",
    desc: "商户",
    permission: [
      Permission.NewsQuery,
      Permission.BusinessInfoUpdate,
      Permission.Uploadable
    ]
  },
  {
    name: "Admin",
    desc: "普通管理员",
    permission: [
      // 新闻类别
      Permission.NewsCreate,
      Permission.NewsUpdate,
      Permission.NewsDelete,
      Permission.NewsQuery,

      // 用户类别
      Permission.UserFreeze
    ]
  },
  {
    name: "SuperAdmin",
    desc: "超级管理员",
    permission: [
      // 新闻类别
      Permission.NewsCreate,
      Permission.NewsUpdate,
      Permission.NewsDelete,
      Permission.NewsQuery,

      // 用户类别
      Permission.UserFreeze,

      // 只有超级管理员才有权限更改用户余额
      Permission.WalletMutation,

      // 超级管理员才能更改权限
      Permission.PermissionMutation
    ]
  }
];

// 创建一个角色
export function createRole(
  name: string,
  desc: string,
  permission: Permission[]
) {
  // TODO: 校验调用这个函数的权限
  if (Roles.findIndex(v => v.name === name) >= 0) {
    throw new Error(`role ${name} exist!`);
  }
  Roles.push({
    name,
    desc,
    permission
  });
}

// 更新角色的权限
export function updateRole(name: string, permission: Permission[]) {
  // TODO: 校验调用这个函数的权限
  const index = Roles.findIndex(v => v.name === name);
  if (index < 0) {
    throw new Error(`role ${name} not exist!`);
  }
  Roles[index].name = name;
  Roles[index].permission = permission;
}

// 检查一个用户是否有权限
export function hasPermission(user: User, permission: Permission): boolean {
  for (let role of user.roles) {
    const Role = Roles.find(v => v.name === role);

    if (Role) {
      for (let per of Role.permission) {
        if (per === permission) {
          return true;
        }
      }
    }
  }
  return false;
}

大牛们的评论:朕有话说

还没有人评论哦,赶紧抢沙发!