Политика 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.
Надеюсь, это поможет!