パラメータを受け入れることができるミドルウェアを作成しようとしています。これはどのように行うことができますか?
例
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
パラメータを受け入れることができるミドルウェアを作成しようとしています。これはどのように行うことができますか?
例
app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){
})
HasRole = function(role, req, res, next){
if(role != user.role){
res.redirect('/NotInRole);
}
next();
}
回答:
function HasRole(role) {
return function(req, res, next) {
if (role !== req.user.role) res.redirect(...);
else next();
}
}
また、同じ関数の複数のコピーを作成しないようにしたいです。
function HasRole(role) {
return HasRole[role] || (HasRole[role] = function(req, res, next) {
if (role !== req.user.role) res.redirect(...);
else next();
})
}
app.get('/a', hasRole('admin'))
およびapp.get('/b', hasRole('admin'))
ごとに新しいクロージャを作成しますhasRole
。非常に大きなアプリケーションがない限り、これは現実的にはそれほど重要ではありません。私はデフォルトでこのようにコーディングします。
app.get('/hasToBeAdmin', (req, res, next) => {
hasRole(req, res, next, 'admin');
}, (req,res) => {
// regular route
});
const hasRole = (req, res, next, role) => {
if(role != user.role){
res.redirect('/NotInRole');
}
next();
};
または、ケースが多すぎない場合、またはロールが文字列でない場合:
function HasRole(role) {
return function (req, res, next) {
if (role !== req.user.role) res.redirect(/* ... */);
else next();
}
}
var middlware_hasRoleAdmin = HasRole('admin'); // define router only once
app.get('/hasToBeAdmin', middlware_hasRoleAdmin, function (req, res) {
})
さまざまなアクセス許可レベルがある場合は、次のように構成できます。
const LEVELS = Object.freeze({
basic: 1,
pro: 2,
admin: 3
});
/**
* Check if user has the required permission level
*/
module.exports = (role) => {
return (req, res, next) => {
if (LEVELS[req.user.role] < LEVELS[role]) return res.status(401).end();
return next();
}
}
私はこのソリューションを使用します。body reqでjwtトークンを受け取り、そこから役割情報を取得します
//roleMiddleware.js
const checkRole = role => {
return (req, res, next) => {
if (req.role == role) {
console.log(`${role} role granted`)
next()
} else {
res.status(401).send({ result: 'error', message: `No ${role} permission granted` })
}
}
}
module.exports = { checkRole }
したがって、最初に認証ミドルウェアを使用してが有効なユーザーであるかどうかを確認し、次にロールミドルウェアを使用してユーザーがAPIルートにアクセスできるかどうかを確認します
// router.js
router.post('/v1/something-protected', requireAuth, checkRole('commercial'), (req, res) => {
// do what you want...
})
役に立つことを願っています