1

我在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

4

2 回答 2

1

就方法而言,一定要查看@arkoak的答案。我不确定这是否能解决您的全部问题,但这里有一些可能会有所帮助的东西。

目前,您正在策略配置的 LHS 上映射模型。它工作的原因是因为我们有一些适当的猜测逻辑——但实际上你想使用控制器。策略只是位于用户传入请求和控制器操作之间的可配置中间件。

因此,例如,而不是User作为键,尝试:

UserController:{
  '*': 'SuOrAdmin',
  findOne: 'User'
}

我要提到的另一件事是澄清政策不会级联 - 也就是说,如果您有:

'*': 'foo',

NoticiaController: { '*': 'bar' }

...那么 NoticiaController 的动作将只受到保护bar(不是fooAND bar- 赶上我的漂移?)

至于您作为超级管理员无法找到的确切问题Noticia,我相信这是因为您的政策是互斥的,就像@arkoak 所建议的那样。

希望有帮助!

于 2015-02-26T17:53:55.133 回答
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
     ....
 }
于 2015-02-26T04:11:43.250 回答