我已經能夠使用JWT策略實施護照,並且運行良好。我的智威湯遜保護路線是這樣的......如何將jwt身份驗證與ACL結合使用
app.get('/thingThatRequiresLogin/:id', passport.authenticate('jwt', { session: false }), thingThatRequiresLogin.findById);
現在我需要限制某些事情屬於一定的作用只登錄用戶訪問。我希望我能表達這樣的:
app.get('/thingThatRequiresLogin/:id', MAGIC, thingThatRequiresLogin.findById);
凡MAGIC = require logged-in users, but only those with role x or y
node_acl似乎是一個很好的解決方案,我理解到一個點,但後來我發現這在doc ...
我們可以保護這樣的資源:
app.put('/blogs/:id', acl.middleware(), function(req, res, next){…}
中間件將保護req.url命名的資源,從挑選的req.session.userId用戶 和檢查req.method許可, 所以上面就相當於是這樣的:
如何將此與我的jwt策略混合使用?我唯一的想法是放棄node_acl middleware
,而是將acl檢查代碼添加到我的jwt策略中。但那是我遇到麻煩的地方。我的智威湯遜的功能如下:
passport.use(new JwtStrategy(jwtOptions, function(jwt_payload, done) {
User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
// or you could create a new account
}
});
}));
據node_acl,我可以問這樣的事情...
acl.isAllowed('jsmith', 'blogs', ['edit','view','delete'])
所以我可以(應該吧?)改變我的JwtStrategy說類似。 ..
if (user && acl.isAllowed(user.username, 'blogs', ['edit','view','delete']) {
// ...
如果是這樣,怎麼會這個函數知道資源名稱'blogs'
和權限['edit' etc]
?這些在路線定義的點上是已知的,但我認爲我需要他們在戰略功能中。我是否全部錯了?有人能告訴我正確的方法嗎?