如何在Node.js护照中实现用户角色

时间:2019-04-02 10:10:35

标签: javascript node.js express passport.js

如何使用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);
            });
        }
    }));
}

1 个答案:

答案 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模块