2017-08-04 97 views
0

我使用expressJS構建應用程序API。在這個應用程序中有一個公共部分和一個私人部分。ExpressJS使用相同的端點處理多個獲取路由

兩個部分需要顯示的用戶列表。但只有私人部分才能顯示完整列表。

我用express-authorize middlewar處理autorization。所以我定義了兩個授權:

'市民:用戶:列表'

'私人:用戶:列表'

在表達我有試着寫的路線是這樣的:

router.route('/users') 
    .get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('private:users:list')], (req, res) => { 
     getUserList(req, res); 
    }) 
    .get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => { 
     req.query.filter.roles.name = 'user' 
     getUserList(req, res); 
    }); 

但這不起作用。請求失敗,因爲第一次獲得未經授權,從未進入第二次。是否有意思讓這個作品?或任何其他技術。如果可能的話避免創建另一個端點像(router.route(「usersPublic」)

THX

編輯:

我重寫onDenied功能類似這樣的,並在該路徑的改變。

var authorizer = new authorizer.Authorizer(authorizer.options); 
authorizer.options.onDenied = function (req, res, next) { next('route') }; 


authorizer.options.withSubject = function (req, res, done) {} 

,似乎工作。但是,如果沒有途徑是有效的。我得到一個404錯誤,而不是403.什麼建議嗎?

EDIT2:

onDenied不應該在全球,但路由本身這樣

router.route('/users')..get([passport.authenticate('jwt', { session: false }), authorization.authorizer.onDenied((req, res, next) => next('route')).isPermitted('private:users:list')], (req, res) => { 
      getUserList(req, res); 
     }); 

    router.route('/users')..get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => { 
     req.query.filter.roles.name = 'user' 
     getUserList(req, res); 
    }); 
+0

爲什麼不能你只需要在同一個塊中的兩個條件是什麼? –

+0

我可以。但如果可能的話,想要處理與中間件的所有授權 – Scandinave

+0

根據我的理解,這是不可能的。 –

回答

1

內設置我不熟悉的express-authorize,所以下面是從源頭拼湊起來的,可不行。

首先,你需要改變身份驗證的不匹配是如何處理的。默認值是重定向到/login,但你需要這樣的請求被傳遞到下一個路由鏈更改:

let myAuthorizer = authorization.authorizer.onDenied((req, res, next) => next('route')); 

然後,你需要設置兩個不同的路線/users

router.route('/users').get([passport.authenticate('jwt', { session: false }), myAuthorizer.isPermitted('private:users:list') ], (req, res) => { 
    getUserList(req, res); 
}) 

router.route('/users').get([passport.authenticate('jwt', { session: false }), authorization.authorizer.isPermitted('public:users:list')], (req, res) => { 
    req.query.filter.roles.name = 'user' 
    getUserList(req, res); 
}); 

next('route')解釋here,但它基本上意味着,而不是將請求傳遞到下一個處理器在當前鏈,它傳遞給下一個完整路徑鏈(在這種情況下是第二router.route('/users')如果私有訪問被拒絕)。

+0

我已經編輯你的建議我的問題。 – Scandinave

+0

@Scandinave思考它,你可能不應該使用'onDenied'作爲第二條路線,並讓默認處理程序處理授權失敗(重定向到「/ login」)。我會編輯我的答案,看看是否解決了你的404(儘管從我的理解你的問題,你正在設置全局'onDenied',你可能不應該這樣做)。 – robertklep

+0

是的,工作。非常感謝 – Scandinave