Политика Sails.js не работает для одного контроллера

У меня есть 4 политики в sails.js, SuperUser, Admin, User и SuOrAdmin и 3 модели с контроллерами проекта, это конфигурация политик:

   '*': 'SuperUser',

  User:{
    '*': 'SuOrAdmin',
    findOne: 'User'
  },

  Empresa:{
    '*': 'SuperUser',
    findOne: 'Admin',
    findOne: 'User'
  },

  Noticia:{
    '*': 'SuOrAdmin',
    find: 'User',
    findOne: 'User'
  } 

Когда я вхожу в SuperUser, я могу CRUD для всех моделей, кроме метода поиска Noticia, но когда я вхожу в систему от администратора, я могу CRUD для модели Noticia, это политика SuOrAdmin:

module.exports = function(req, res, next) {

  // User is allowed, proceed to the next policy, 
  // or if this is the last policy, the controller
  if ( (req.session.user && req.session.user.admin) || (req.session.SuperUser) ) {
    return next();
  }

  // User is not allowed
  // (default res.forbidden() behavior can be overridden in `config/403.js`)
  return res.json(403, {error: 'You are not permitted to perform this action.'});
};

Может кто-нибудь помочь мне, пожалуйста, я застрял 2 дня в этой проблеме.

@mikermcneil

2 ответа

Решение

Вы можете применить несколько политик к одной функции, как показано ниже

Noticia:{
    '*': 'superAdmin',
    find: ['isUser','isSuperAdmin','isAdmin'],
    ...
  } 

В некоторых случаях это может быть не самым простым подходом.

Альтернативным более простым способом в вашем случае может быть включение каждого уровня в предыдущий, так что пользователь более высокого уровня всегда может использовать права пользователя более низкого уровня, например, это ваши уровни

  • isUser
  • IsAdmin
  • isSuperAdmin

В методе isUser сначала проверьте, является ли он администратором, затем вернитесь затем, затем проверьте свою логику пользователя.

 module.exports = function isUser(req, res, next) {
    if(is_admin)return next();  //you need to provide logic for is_admin here
    //remaining user check logic below
     .... 
 }

Аналогичным образом, в методе Admin сначала проверьте его SuperAdmin и вернитесь далее, затем проверьте логику администратора

  module.exports = function isAdmin(req, res, next) {
    if(is_su)return next();  //you need to provide logic for is_su here
    //remaining admin check logic below
     ....
 }

Определенно проверьте ответ @arkoak, насколько подход. Я не уверен, решит ли это вашу полную проблему или нет, но вот что-то еще, что может помочь.

В настоящее время вы отображаете модели в LHS вашей конфигурации политики. Причина, по которой это работает, заключается в том, что у нас есть приличная логика догадок, но на самом деле вы хотите использовать контроллеры. Политики - это просто настраиваемое промежуточное ПО, которое располагается между входящими запросами пользователей и действиями вашего контроллера.

Так, например, вместо User в качестве ключа попробуйте:

UserController:{
  '*': 'SuOrAdmin',
  findOne: 'User'
}

Еще одна вещь, которую я хотел бы упомянуть, это уточнить, что политики не каскадные, то есть, если у вас есть:

'*': 'foo',

NoticiaController: { '*': 'bar' }

... тогда действия NoticiaController будут защищены только под bar (не foo А ТАКЖЕ bar- поймать мой занос?)

Что касается вашей точной проблемы невозможности найти из Noticia как суперадмин, я считаю, что это потому, что ваша политика взаимоисключающая, как то, что предложил @arkoak.

Надеюсь, это поможет!

Другие вопросы по тегам