Sails.js 策略不适用于单个控制器
Sails.js policy not working for a single controller
我在 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 登录时,我可以对除 Noticia 的 find 方法之外的所有模型进行 CRUD,但是当我使用 Admin 登录时,我可以对 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
您可以将多个策略应用到一个函数,如下所示
Noticia:{
'*': 'superAdmin',
find: ['isUser','isSuperAdmin','isAdmin'],
...
}
在某些情况下,这可能仍然不是最简单的方法。
一个备选更简单的方法可能是将每个级别都包含在前一个级别中,因此更高级别的用户始终可以使用较低级别的用户权限,例如, 这些是你的水平
- 是用户
- 是管理员
- 是超级管理员
在 isUser 方法中,首先检查它是否是管理员,return 接下来,然后检查您的用户逻辑
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 和 return 接下来,然后检查您的管理逻辑
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 所建议的那样。
希望对您有所帮助!
我在 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 登录时,我可以对除 Noticia 的 find 方法之外的所有模型进行 CRUD,但是当我使用 Admin 登录时,我可以对 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
您可以将多个策略应用到一个函数,如下所示
Noticia:{
'*': 'superAdmin',
find: ['isUser','isSuperAdmin','isAdmin'],
...
}
在某些情况下,这可能仍然不是最简单的方法。
一个备选更简单的方法可能是将每个级别都包含在前一个级别中,因此更高级别的用户始终可以使用较低级别的用户权限,例如, 这些是你的水平
- 是用户
- 是管理员
- 是超级管理员
在 isUser 方法中,首先检查它是否是管理员,return 接下来,然后检查您的用户逻辑
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 和 return 接下来,然后检查您的管理逻辑
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 所建议的那样。
希望对您有所帮助!