如何在sails.js 中创建动态策略

Posted

技术标签:

【中文标题】如何在sails.js 中创建动态策略【英文标题】:How to create dynamic policies in sails.js 【发布时间】:2015-04-21 11:57:18 【问题描述】:

我一直在从事一个项目,我需要根据sails.js 中的用户的访问权限/级别创建和分配策略

每个用户都可以访问其级别以下的所有级别,例如管理员有 9 级,他可以访问 9 级以下的所有级别

目前在sails中所有的策略都存储在

API/政策

文件夹并在

中分配给控制器

配置/policies.js

module.exports.policies = 

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

我的问题是如何根据来自 db 的访问级别制定动态策略

我用谷歌搜索了它,但没有找到关于的信息,所以在这里发布。

感谢您对此的帮助。

谢谢

【问题讨论】:

【参考方案1】:

查看sails-permissions

sails.js 和 Waterline 的综合用户权限和权利系统。支持使用 passport.js 进行用户身份验证、基于角色的权限、对象所有权和行级安全性。

【讨论】:

感谢回答,没有passport.js可以用吗? 我不确定您为什么不想使用护照,但您可以根据需要禁用它。您只需要编写自己的自定义登录内容。 哦,是的,免责声明:我是sails-permissions 的作者 谢谢 Travis,sails-permission 很棒,我决定用它来创建角色和策略。感谢您的宝贵时间。【参考方案2】:

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

政策/level01.js 政策/level02.js 等等。 . .

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

policies/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,
;

从这样的东西开始,可以熟悉这些政策的工作并从那里建立起来。准确了解和了解您的安全工作方式始终非常重要。

【讨论】:

如何根据配置中的级别调用策略,因为每个用户可以有不同的访问级别? 你根据端点的限制调用策略。因此,如果 UserController.create 仅限于具有级别 4 的那些,那么在上面的示例中,您将把 ['policy04.js'] 放在创建操作上,然后让 policy04.js 检查以确保它们确实处于级别4.【参考方案3】:

@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');
    
;

最好的问候

【讨论】:

【参考方案4】:

一年半后,如果有人遇到这种情况,sails-must 似乎是一个不错的解决方案。

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

免责声明:我自己没有使用过。

【讨论】:

以上是关于如何在sails.js 中创建动态策略的主要内容,如果未能解决你的问题,请参考以下文章

passport.js 使用sails.js 验证弹出窗口

Sails.js WebSocket 如何创建新通道?

使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?

如何在anylogic中创建特定的仓单拣货策略

使用 Sails.JS 框架的 Node.JS -- Passport:没有在名称下注册策略:facebook

在 Sails Js App 中将用户模型密码发送到客户端