Bei*_*man 14 javascript rbac mongodb node.js
我正在学习MEAN堆栈,开发一个简单的TODO应用程序,并希望实现基于角色的访问控制(RBAC).如何在MongoDB上设置角色和权限.
我想要3个角色(角色可能看起来很有趣,但这纯粹是为了学习):
GOD - 类似于超级管理员,可以在应用程序中执行任何操作.TODO和其他用户的C,R,U,D权限.可以创建TODO并直接将其分配给任何SUPER HERO或MAN.在任何时间点更新或删除TODO或用户.
超级英雄 - 类似于管理员,有超级能力对他的个人数据做任何事情 - C,R,U,D为TODO.无法创建任何用户.只能阅读并添加由GOD创建并分配给他/她的TODO的评论.
MAN - 只能阅读并添加评论给分配给他/她的TODO.
把它们加起来 :
GOD - C,R,U,D [Global Level]
SUPER HERO - C,R,U,D [Private] + R,U [Assigned to him]
MAN - R,U [Assigned to him]
我知道我需要拥有USERS&ROLES系列.ROLES在哪里应该有PERMISSIONS等.我如何连接它们?
小智 21
我喜欢角色的名字 - 上帝,超级英雄和男人,易于理解.
当您使用MEAN堆栈并且大量路由验证发生时node,我更希望保持角色表简单.
角色:
{
_id : 1,
name : GOD,
golbalPerms : true
},
{
_id : 2,
name : SUPER HERO,
privatePerms : true
},
{
_id : 3,
name : MAN
}
Run Code Online (Sandbox Code Playgroud)
用户:
{
_id : 111,
name : Jesus,
roleId : 1
},
{
_id : 222,
name : BatMan,
roleId : 2
},
{
_id : 333,
name : Jack,
roleId : 3
}
Run Code Online (Sandbox Code Playgroud)
当用户登录并将user对象发送回客户端时,请确保从DB中替换roleId相应的role对象.
来自Node JS的代码:
通过完全理解您的用例,我们可以将它们分为以下几种方法 -
创建用户
CreateTodo
DeleteTodo
ReadTodo
CommentTodo
AssignTodo
让我们一步一步,CreateUser.
路线代码段:
app.all('/users', users.requiresLogin);
// Users Routes
app.route('/users')
.post(users.hasPerms('globalPerms'), users.create);
Run Code Online (Sandbox Code Playgroud)
在您的控制器中,您可以根据输入globalPerms进行验证,如果经过验证,则允许通过调用next()else 来创建用户并return提供相应的错误消息.
现在CreateTodo && DeleteTodo:
他们两个都用一个小技巧在相同的逻辑上工作.
路线代码段:
app.all('/todos', users.requiresLogin);
// Users Routes
app.route('/todos')
.post(users.hasPerms('globalPerms','privatePerms'), todos.create);
.delete(users.hasPerms('globalPerms','privatePerms'), todos.delete);
Run Code Online (Sandbox Code Playgroud)
要创建待办事项,globalPerms与GOD及privatePerms与超级英雄,他们都可以被允许.
这里的伎俩将是todos.delete方法,只是确保user.id === todos.createByIdSUPER HERO可以继续删除由GOD创建的Todos.
ReadTodo:
当创建TODOcreateById时,当TODO被分配给某人时,它应该同样存储,assignedTo并且也assignedBy应该被记录.
这使得许多其他操作易于处理.
user.role.globalPerms - 向GOD提供所有TODO的数据.
user.role.privatePerms - 将TODO创建给他/她或分配给他/她.
user.role.globalPerms === undefined && user.role.privatePerms === undefined - 它的MAN并给TODO's,它们只分配给他.
UpdateTodo&CommentTodo:
这是ReadTODO所做的精彩复制品
最后一个,AssignTodo:
简单的,loggedInUser.id === todos.createdById然后他可以分配给任何人.
这里要记住两件事:
由于分配部分主要发生在你的UI(Angular)前面,我已经给出了这种检查方法loggedInUser.id === todos.createdById.以任何方式登录用户将通过读取操作查看所有TODO,并可将其分配给他/她喜欢的任何人.
确保SUPER HERO只能为自己或其他SUPER HERO或MAN分配TODO,但不能分配给GOD.如何在UI前面显示分配给选项超出了此问题的范围.这只是一个抬头.
希望这很清楚.
注意:没有必要在Roles集合中授予MAN权限,我们管理所有可能的操作.
| 归档时间: |
|
| 查看次数: |
12297 次 |
| 最近记录: |