#javascript #node.js #express #rbac
#javascript #node.js #выразить #rbac
Вопрос:
Я использую nodejs, expressjs для своего бэкэнда. Я пытаюсь создать простое веб-приложение с контролем доступа к базе ролей, но я не уверен, что то, как я это делаю, является правильным / рекомендуемым способом.
У меня есть три роли: суперадминистратор, администратор и пользователь, и вот как я это делаю:
const checkRoleMiddleware = (req, res, next) => {
const getPostUserId = getPostFromDb(req.params.postId);
const getPostUserData = getPostUserFromDb(getPostUserId);
if(req.user.id === getPostUserData.id){
/* next */
}else if(req.user.permission === 'admin'){
if(/* Check some other things amp; compare some other things */){
/* next */
}else{
/* return unauthorized */
}
}else if(req.user.permission === 'super admin') {
/* next */
}else{
/* return unauthorized */
}
};
/* use checkRoleMiddleware on this route*/
app.post('/user/post/edit/:postId', checkRoleMiddleware, (req,res) => {
/* Do something */
});
Является ли это безопасным, правильным / рекомендуемым способом управления доступом к базе ролей в приложении express? Что, если у меня больше ролей, нужно ли мне создавать больше инструкций if? Есть ли другие лучшие способы сделать это?
Комментарии:
1. Возможно, с помощью Casbin? casbin.org/docs/en/overview
Ответ №1:
Я мог бы предложить 3 разных подхода к этой проблеме (помимо того, что у вас есть сейчас, поскольку это тоже правильный подход)
Вариант 1 Вы можете присвоить целочисленное значение каждой из групп (super admin — 2, admin — 1, user — 0), а для управления доступом на основе ролей просто проверьте, является ли значение группы пользователей выше назначенного.
Вариант 2 Если вы хотите разрешить разные роли для разных действий, вы можете сохранить массив разрешенных ролей / идентификаторов ролей для каждого действия и проверить, включает ли он роль пользователя.
Вариант 3 Вы можете хранить роли действий / роли пользователей в виде двоичного значения. Например, вы назначаете 1 пользователю, 2 администратору, 4 суперадминистратору, 8 супер суперадминистратору. Таким образом, если вы присвоите пользователю номер 9, он будет одновременно ПОЛЬЗОВАТЕЛЕМ и СУПЕР-СУПЕР-АДМИНИСТРАТОРОМ, что позволит вам более гибко распределять роли в проекте. Вы также можете разрешить определенные роли для определенных действий, например, если вы хотите, чтобы действие выполнялось только администратором и выше, вы можете присвоить им значение 14 (2 4 8 ).