我在sails.js,SuperUser,Admin,User和SuOrAdmin中有4个策略,还有3个带蓝图控制器的模型,这是策略配置:
'*': 'SuperUser',
User:{
'*': 'SuOrAdmin',
findOne: 'User'
},
Empresa:{
'*': 'SuperUser',
findOne: 'Admin',
findOne: 'User'
},
Noticia:{
'*': 'SuOrAdmin',
find: 'User',
findOne: 'User'
}
当我使用SuperUser登录时我可以CRUD除了Noticia的find方法之外的所有模型,但是当我使用Admin登录时我可以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
答案 0 :(得分:1)
您可以将多个政策应用于单个功能,如下所示
Noticia:{
'*': 'superAdmin',
find: ['isUser','isSuperAdmin','isAdmin'],
...
}
在某些情况下,这可能仍然不是最简单的方法。
在您的情况下,替代更简单的方法可能是您在前一个级别中包含每个级别,因此更高级别的用户可以始终使用较低级别的用户权限,例如,这些是您的级别
在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并返回next,然后检查管理逻辑
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
....
}
答案 1 :(得分:1)
绝对可以查看@ arkoak的答案。我不确定这是否能解决您的完整问题,但这里还有其他可能有帮助的地方。
目前,您在策略配置的LHS上映射模型。它工作的原因是因为我们有适当的猜测逻辑 - 但实际上你想要使用控制器。策略只是可配置的中间件,位于来自用户的传入请求和控制器操作之间。
例如,不要使用User
作为密钥,请尝试:
UserController:{
'*': 'SuOrAdmin',
findOne: 'User'
}
我要提到的另一件事是澄清政策没有级联 - 也就是说,如果你有:
'*': 'foo',
NoticiaController: { '*': 'bar' }
...然后NoticiaController的操作只会受到bar
的保护(不是foo
和bar
- 抓住我的漂移?)
至于你无法从Noticia
找到superadmin的确切问题,我相信这是因为你的政策是互相排斥的,就像@arkoak建议的那样。
希望有所帮助!