世界上最伟大的投资就是投资自己的教育

首页Ant Design Pro
随风 · 练气

ant design pro 如何处理权限管理

随风发布于180 次阅读

ant design pro 的前端去处理权限好处理的,弄个增删改查。直接去发请求就好。

主要是后端,如何存权限的信息,要存什么信息,如何验证。

import mongoose, { Document } from 'mongoose';
import { IPermissionGroup } from './permissionGroup';


export interface IPermission extends Document {
  name: string;
  path: string;
  action: string;
  permissionGroup: IPermissionGroup;
  createdAt?: Date;
  updatedAt?: Date;
}

const permissionSchema = new mongoose.Schema({
  name: { type: String, required: true },
  path: { type: String, required: true },
  action: { type: String, required: true },
  permissionGroup: { type: mongoose.Schema.Types.ObjectId, ref: 'PermissionGroup' },
}, { timestamps: true });

const Permission = mongoose.model<IPermission>('Permission', permissionSchema);

export default Permission;

name 是显示出来给看的,主要是 path action 这两个结合起来,来标明一个唯一的权限。

一个路径,一个 是请求方法。


如何去检查是否有权限呢。

const checkPermission = handleAsync(
  async (req: IRequest, res: Response, next: NextFunction) => {
    const { pageSize } = req.query as { pageSize?: string };

    if (pageSize && pageSize === '10000') {
      return next();
    }

    const path = req.baseUrl + req.route.path;
    const action = req.method;

    console.log('Checking path for permission', path);

    if (req.user.isAdmin) {
      return next();
    }

    if (allowedPaths.some((str) => path.startsWith(str))) {
      return next();
    }

    const roles = req.user.roles as { permissions: IPermission[] }[];

    if (roles.length === 0) {
      res.status(403);
      throw new Error('Access Denied');
    }

    const isAllowed = (permissions: IPermission[]) => {
      return permissions.some((permission) => {
        return permission.path === path && permission.action === action;
      });
    };

    if (roles.some((role) => isAllowed(role.permissions))) {
      next();
    } else {
      res.status(403);
      throw new Error('Access Denied');
    }
  },
);

这是个中间件,只要在路由里先用上就行,就是先检查一下是否有权限

首先如果是超级管理员,是直接跳过的。因为有所有的权限

if (req.user.isAdmin) {
  return next();
}

然后再判断是否有角色的,角色都没有,肯定没有权限了。

最后才是在所有角色里找到权限来判断,依据的标准是 path action 这两个。

刚好这两个我们是能取到的,在请求里取到值,跟用户存的数据库的数据匹配即可。

就是角色里的权限数据匹配。

所以 current user 是要存 roles, roles 里又要存权限的。

我们拥有 12 年建站编程经验

  1. 虚拟产品交易平台定制开发
  2. WordPress 外贸电商独立站建站

我的网站

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
统计信息
    学员: 30001
    视频数量: 1996
    文章数量: 526

© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top