Sails.js策略不适用于单个控制器
我在sails.js中有4个策略,SuperUser、Admin、User和SuOrAdmin,还有3个带有blueprint控制器的模型,这是策略配置:Sails.js策略不适用于单个控制器,sails.js,policies,Sails.js,Policies,我在sails.js中有4个策略,SuperUser、Admin、User和SuOrAdmin,还有3个带有blueprint控制器的模型,这是策略配置: '*': 'SuperUser', User:{ '*': 'SuOrAdmin', findOne: 'User' }, Empresa:{ '*': 'SuperUser', findOne: 'Admin', findOne: 'User' }, Noticia:{
'*': 'SuperUser',
User:{
'*': 'SuOrAdmin',
findOne: 'User'
},
Empresa:{
'*': 'SuperUser',
findOne: 'Admin',
findOne: 'User'
},
Noticia:{
'*': 'SuOrAdmin',
find: 'User',
findOne: 'User'
}
当我使用超级用户登录时,我可以对除Notifia的find方法之外的所有模型进行CRUD,但当我使用管理员登录时,我可以对Notifia模型进行CRUD,这是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.'});
};
有人能帮我一下吗?我在这个问题上被耽搁了两天
@mikermcneil您可以对单个函数应用多个策略,如下所示
Noticia:{
'*': 'superAdmin',
find: ['isUser','isSuperAdmin','isAdmin'],
...
}
在某些情况下,这可能仍然不是最简单的方法
另一种更简单的方法是,您可以在上一个级别中包含每个级别,以便更高级别的用户始终可以使用较低级别的用户权限,例如,这些是您的级别
- iUser
- 伊萨明
- 发行人管理员
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' }
…然后NotificController的操作将仅在bar
下受保护(而不是foo
和bar
捕获我的漂移?)
至于你作为超级管理员无法从Noticia中找到的确切问题,我相信这是因为你的政策是相互排斥的,就像@arkoak建议的那样
希望有帮助 我尝试过你的答案,但这给了我同样的结果,当我用超级管理员登录时,我找不到Notifia模型,但我可以发布到它,但当我以管理员身份登录时,我可以找到Notifia并发布到它。我使用了第二种方法,谢谢!!