【问题标题】:How to create dynamic policies in sails.js如何在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 的访问级别制定动态策略

我用谷歌搜索了它,但没有找到关于如何在sails.js 中创建动态策略的信息,所以在这里发布。

感谢您对此的帮助。

谢谢

【问题讨论】:

    标签: javascript node.js express sails.js policies


    【解决方案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]
      },
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2017-07-13
        • 2011-06-30
        • 2014-02-16
        • 1970-01-01
        相关资源
        最近更新 更多