gpt4 book ai didi

javascript - 如何将 passport-jwt 与 ACL(访问控制列表)模式相结合

转载 作者:行者123 更新时间:2023-11-29 23:25:27 25 4
gpt4 key购买 nike

我正在使用 passport-jwt。我正在尝试在我的系统中实现 acl 模式。我的系统中有一些不同的 Angular 色。我想控制他们对某些资源的访问权限。

我认为在基于 token 的身份验证中执行此操作的常用方法是为 express.js 编写一个中间件,它将验证 token 并将“Angular 色”字段添加到“req.user”。然后将另一个中间件安装到每个路由,这将指定哪些 Angular 色可以访问它们。 所以我的问题是,如何将这种方法与 passport-jwt 结合起来。

加上: passport-jwt策略的常用使用方式:

  app.get('/myapi', passport.authenticate('jwt', {session: false}),
function(req, res, next){ ...})

token based authentication我认为常见的方式:

app.use(function(req, res, next){
token = extractToken(req)
jwt.verify(token, key, function(err, decoded) {
if (err) {
return res.send(err);
} else {
users.findOne({userId: decoded.userId}, function(err, user){
if(!user) res.send('unknown')
else{
req.user = user //in which include a role field.
// for example: user.role = 'user' | 'manager'
}
})
}
});
})

and at every route:

function checkRole(roles){
return function (req, res, next) {
if (req.session.user && roles.includes(req.user.role)) {
next();
} else {
res.send(403);
}
}
}

app.get('/myapi', checkRole(['user']), function(req, res){
....
})

最佳答案

我想出了自己。我写了一个中间件来一起做这些事情:

/*middleware/acl.js */

export function checkRoleWithPassport(roles, passport, strategy, opts){
return function(req, res, next){
passport.authenticate(strategy, opts, function(err, user, info){
if(err) res.status(403).send('forbidden')
else if(!user) res.status(403).send('forbidden')
else{
if(roles.length == 0)
next()
else if(roles.includes(user.role))
next()
else
res.status(403).send('forbidden')
}
})(req, res, next)
}
}

/* route/index.js */
app.get('/myapi', checkRoleWithPassport(['manager'], passport,
'jwt', {session, false}), function(req, res){
...
}) // this should only allow the 'manager' to access /myapi

关于javascript - 如何将 passport-jwt 与 ACL(访问控制列表)模式相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49503124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com