我目前正在做一个有多个用户模式的项目,作为管理员,教师,学生都是不同的模式和不同的结构。 结构非常糟糕,但是所有的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一起工作,否则它会像预期的那样未经授权。 请建议我一个方法,我可以同时应用于所有三个模式,而不是一次又一次地改变它。
我建议查找身份验证
和授权
方法学(基于角色的身份验证)。
它的要旨是为用户创建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]
[用户]
[UsersRoles]
[角色]
[角色权限]
[权限]