如何使用expressjs和护照在nodejs中实现基于角色的授权/访问控制,以及如何完美地设计Role Middleware?
我有两种类型的登录名管理员和用户
哪个最好,以admin和user的名义创建两个模型和路由器?
1。是否检查用户isAdmin
2。
// To authtenticate the User by JWT Startegy
module.exports = (userType, passport) => {
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
if (userType == 'admin') {
Admin.getAdminById(jwt_payload.data._id, (err, user) => {
if (err) return done(err, false);
if (user) return done(null, user);
return done(null, false);
});
}
if (userType == 'users') {
User.getUserById(jwt_payload.data._id, (err, user) => {
if (err) return done(err, false);
if (user) return done(null, user);
return done(null, false);
});
}
}));
}
答案 0 :(得分:0)
为什么要在2个地方获取用户数据?
拥有用户并为其分配角色。
最简单的访问控制系统是:访客,登录,管理员。
因此,在表users
中添加一个role
列,其值是:用户,管理员。
现在您编写中间件:
const isLogged = function (req, res, next) {
if (req.user)
return next ();
res.send ('unauth')
}
const isAdmin = function (req, res, next) {
if (req.user.role == 'admin')
return next ();
res.send ('only admin')
}
和用法:
app.get('/', (req, res)=>{})
app.get('/profile',isLogged, (req, res)=>{})
app.get('/admin',isLogged, isAdmin, (req, res)=>{})
对于更高级的需求,请尝试找到一些ACL模块