提问者:小点点

我可以在同一个express框架中为多个用户模式使用Passport JWT吗


我目前正在做一个有多个用户模式的项目,作为管理员,教师,学生都是不同的模式和不同的结构。 结构非常糟糕,但是所有的API都是不能真正地把它改回来的。

所以这里的问题是用户身份验证是由passport和JWT配置的。 但它只为教师配置。

const Teacher = require("../models/Teacher");
const User = require("../models/User");
const { SECRET } = require("../config");
const { Strategy, ExtractJwt } = require("passport-jwt");

const opts = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: SECRET
};

module.exports = passport => {
  passport.use(
    new Strategy(opts, async (payload, done) => {
      await Teacher.findById(payload.user_id)
        .then(user => {
          if (user) {
            return done(null, user);
          }
          return done(null, false);
        })
        .catch(err => {
          return done(null, false);
        });
    })
  );
};

但我需要它为其他两个模式以及。 当我为其他人测试api时,我只需await Teacher.findbyid(payload.user_id)将教师更改为User,它与api的userAuth一起工作,否则它会像预期的那样未经授权。 请建议我一个方法,我可以同时应用于所有三个模式,而不是一次又一次地改变它。


共1个答案

匿名用户

我建议查找身份验证授权方法学(基于角色的身份验证)。

它的要旨是为用户创建assignroles,而不是拥有作为用户的角色。 则每个roles将具有执行操作的权限。

所以JWT有效载荷将如下所示

{
   name: "USER_NAME",
   roles: ["Admin", "Teacher"], // a user can have multiple roles as will
   permissions: [  
      // merge of both roles permissions
      "add_student",
      "delete_student",
      ...
   ],
}

这样,您就有了一个用户模式,并且可以根据需要添加任意类型的角色权限

关系数据库示例:

[Users] <-1:N-> [UsersRoles] <-N:N-> [Roles] <-1:N-> [RolesPermissions] <-N:N-> [Permissions]

[用户]

  • ID
  • 姓名
  • 用户名
  • 通过

[UsersRoles]

  • user_id
  • role_id

[角色]

  • ID
  • 姓名

[角色权限]

  • role_id
  • permission_id

[权限]

  • ID
  • 姓名