首页 > 解决方案 > 如何在nodejs passportjs中实现用户角色

问题描述

如何使用expressjs和passport在nodejs中实现基于角色的授权/访问控制以及如何完美地设计角​​色中间件?

我有两种类型的登录管理员用户

哪个最好,以管理员和用户的名义创建两个模型和路由器?

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);
            });
        }
    }));
}

标签: javascriptnode.jsexpresspassport.js

解决方案


为什么要有 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 模块


推荐阅读