2015-04-21 28 views
4

动态策略,我一直在做一个项目,我需要在sails.js如何创建sails.js

每个用户都可以访问以下各级建立并根据访问策略分配权限/级别用户他的水平,如管理员有9级,他可以访问以下级别的所有级别9

目前在帆所有政策都存储在

API /政策

文件夹,并分配给控制器

配置/ policies.js

module.exports.policies = { 

UserController: { 
    "create": ['canCreate'], 
    "list": ['canRead'], 
    "show": ['canRead'], 
}, 
AuthController: { 
    '*': true, 
}}; 

我的问题是如何让基于访问级别从数据库

进来的动态策略我已经搜索了它,但没有发现如何在sails.js中创建动态策略,所以在这里发布。

感谢您对此的帮助。

感谢

回答

2

退房sails-permissions

sails.js和Waterline的全面用户权限和授权系统。通过passport.js支持用户认证,基于角色的权限,对象所有权和行级安全。

+0

感谢您的回答,我可以在没有passport.js的情况下使用它吗? –

+0

我不确定你为什么不想使用护照,但是如果你愿意,你可以禁用它。你只需要编写自己的自定义登录信息。 –

+1

哦,是的,免责声明:我是帆的权限的作者 –

1

一个简单的方法是为每个访问级别创建一个策略。

policies/level01.js policies/level02.js 等。 。 。

您的政策文件将检查他们的会话/令牌,以确保他们符合该政策的标准。

政策/ level01.js

module.exports = function(req,res,next){ 
if(req.session.accessLevel = 1) return next(); 
return res.forbidden(); 
} 

然后在你的配置

module.exports.policies = { 
UserController: { 
    "create": ['policyXX.js'], 
    "list": ['policyXX.js'], 
    "show": ['policyXX.js'], 
}, 
AuthController: { 
    '*': true, 
}}; 

开始像这样的东西,可以用这些政策,熟悉工作,并从那里建立。确切了解和理解你的安全工作方式总是非常重要。

+0

我如何根据配置中的级别调用策略,因为每个用户可以具有不同的访问级别? –

+0

您根据终点限制调用策略。因此,如果UserController.create仅限于具有级别4的示例,那么在上面的示例中,您将在创建操作中放置['policy04.js'],然后检查policy04.js以确保它们确实处于级别4。 – Meeker

1

@Travis Webb的解决方案是一个很好的解决方案。 您还可以创建模型角色和模型许可关系链接(一对多,多对多....)如你所愿,然后用这样的一个政策进行筛选:

例子:

module.exports = function isAdmin (req, res, next) { 
    if (typeof req.session.User != "undefined") { 
    User.findOne(req.session.User.id).populate('roles').exec(function(err,user){ 
      if(err) return res.forbidden('You are not permitted to perform this action.'); 
      if(!user) return res.redirect('/user/new'); 
      for(var i in user.roles){ 
       if(user.roles[i]['name'] == 'ROLE_ADMIN'){ 
        return next(); 
       } 
      } 
      return res.redirect('/user/show/'+req.session.User.id); 
     }); 
    } else { 
     return res.redirect('/session/new'); 
    } 
}; 

问候

0

一年半后,如果有人跑成这样,sails-must似乎是一个这个很好的解决方案。

RabbitController: { 
    nurture: must().be.a('rabbit').mother, 
    feed: [must().be.nice.to('rabbits'), must().have('rabbit').food] 
}, 

声明:我没有使用它自己。