Sails.js 政策不适用于单个控制器
Posted
技术标签:
【中文标题】Sails.js 政策不适用于单个控制器【英文标题】:Sails.js policy not working for a single controller 【发布时间】:2015-02-26 00:37:10 【问题描述】:我在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'
当我使用超级用户登录时,我可以对除 Noticia 的 find 方法之外的所有模型进行 CRUD,但是当我使用管理员登录时,我可以对 Noticia 模型进行 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.');
;
谁能帮帮我,我在这个问题上被困了 2 天。
@mikermcneil
【问题讨论】:
【参考方案1】:您可以将多个策略应用于单个函数,如下所示
Noticia:
'*': 'superAdmin',
find: ['isUser','isSuperAdmin','isAdmin'],
...
在某些情况下,这可能仍然不是最简单的方法。
在您的情况下,一种替代更简单的方法可能是您在前一个级别中包含每个级别,因此较高级别的用户始终可以使用较低级别的用户权限,例如,这些是您的级别
是用户 是管理员 是超级管理员在isUser方法中,先检查是否是管理员,返回next,然后检查你的用户逻辑
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
....
【讨论】:
我已经尝试过你的答案,但这给了我相同的结果,当我使用超级管理员登录时,我找不到 Noticia 模型,但我可以发布到它,但是当我以管理员身份登录时,我可以找到公告并发布到它 对不起,我用的是第二种方法,谢谢!!【参考方案2】:就方法而言,一定要查看@arkoak 的答案。我不确定这是否能解决您的全部问题,但这里有一些其他可能会有所帮助的方法。
目前,您正在策略配置的 LHS 上映射模型。它工作的原因是因为我们有一些适当的猜测逻辑——但实际上你想使用控制器。策略只是位于用户传入请求和控制器操作之间的可配置中间件。
因此,例如,不要将User
作为键,尝试:
UserController:
'*': 'SuOrAdmin',
findOne: 'User'
我要提到的另一件事是澄清政策不会级联 - 也就是说,如果您有:
'*': 'foo',
NoticiaController: '*': 'bar'
...那么 NoticiaController 的操作将仅在 bar
下受到保护(而不是 foo
和 bar
- 明白我的意思吗?)
至于您作为超级管理员无法从Noticia
找到的确切问题,我相信这是因为您的政策是互斥的,就像@arkoak 建议的那样。
希望有帮助!
【讨论】:
以上是关于Sails.js 政策不适用于单个控制器的主要内容,如果未能解决你的问题,请参考以下文章
Sails JS 和 mySQL 自定义 ID 名称不适用于蓝图