Правильный способ управления доступом на основе ролей

#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 ).