2016-03-05 96 views
3

我已經能夠使用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]?這些在路線定義的點上是已知的,但我認爲我需要他們在戰略功能中。我是否全部錯了?有人能告訴我正確的方法嗎?

回答

4
app.get('/thingThatRequiresLogin/:id', 
    [ 
    passport.authenticate('jwt', { session: false }), 
    acl.middleware(1, getUserId) 
    ], 
    thingThatRequiresLogin.findById); 

採取線索從該要旨:https://gist.github.com/danwit/e0a7c5ad57c9ce5659d2 和NPM的node_acl DOC:https://www.npmjs.com/package/acl#middleware acl.middleware接受三個可選參數:acl.middleware(numPathComponents,用戶id,權限)

numPathComponents:1 //選擇thingThatRequiresLogin路徑

用戶名:getUserId // getUserId是返回用戶id

我希望這h的功能elps

相關問題