MST

星途 面试题库

面试题:Node.js权限管理系统中如何实现用户角色与权限的关联

在Node.js权限管理系统设计中,阐述如何有效地将用户角色与具体的操作权限进行关联,例如可以从数据库设计、代码逻辑等方面说明,并且简单描述如何在中间件中验证这种关联以控制用户对资源的访问。
49.7万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

数据库设计

  1. 用户表:包含用户基本信息,如idusernamepassword等,同时有一个字段role_id用于关联用户角色表。
  2. 角色表id作为主键,role_name描述角色名称,例如adminuser等。
  3. 权限表id为主键,permission_name描述具体权限,如create_postedit_post等。
  4. 角色 - 权限关联表:通过role_idpermission_id两个字段,建立角色与权限之间的多对多关系,表明某个角色拥有哪些权限。

代码逻辑

  1. 初始化:在应用启动时,从数据库加载所有角色与权限的关联关系,存储在内存中(如使用Map数据结构),方便快速查询。
const rolePermissionMap = new Map();
// 假设从数据库获取角色权限关联数据
const rolePermissions = await RolePermission.findAll();
rolePermissions.forEach(({ role_id, permission_id }) => {
    if (!rolePermissionMap.has(role_id)) {
        rolePermissionMap.set(role_id, []);
    }
    rolePermissionMap.get(role_id).push(permission_id);
});
  1. 用户角色权限获取:当用户登录时,根据用户表中的role_id,从上述内存中的映射关系获取该用户角色所拥有的权限列表。
const user = await User.findByPk(userId);
const userPermissions = rolePermissionMap.get(user.role_id) || [];

中间件验证

  1. 定义中间件:在Express等框架中定义一个中间件函数,用于验证用户是否有权限访问特定资源。
const checkPermission = (requiredPermission) => {
    return (req, res, next) => {
        const user = req.user; // 假设通过身份验证中间件已将用户信息挂载到req.user
        const userPermissions = rolePermissionMap.get(user.role_id) || [];
        if (userPermissions.includes(requiredPermission)) {
            next();
        } else {
            res.status(403).send('Forbidden');
        }
    };
};
  1. 使用中间件:在路由定义中使用该中间件,指定访问该路由所需的权限。
app.get('/posts/create', checkPermission('create_post'), (req, res) => {
    // 创建文章逻辑
});