如何在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 注册后如何重定向到特定位置?