MongoDB + Node JS +基于角色的访问控制(RBAC)

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

  • UpdateTodo
  • 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)

要创建待办事项,globalPermsGODprivatePerms超级英雄,他们都可以被允许.

这里的伎俩将是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然后他可以分配给任何人.

这里要记住两件事:

  1. 由于分配部分主要发生在你的UI(Angular)前面,我已经给出了这种检查方法loggedInUser.id === todos.createdById.以任何方式登录用户将通过读取操作查看所有TODO,并可将其分配给他/她喜欢的任何人.

  2. 确保SUPER HERO只能为自己或其他SUPER HERO或MAN分配TODO,但不能分配给GOD.如何在UI前面显示分配给选项超出了此问题的范围.这只是一个抬头.

希望这很清楚.

注意:没有必要在Roles集合中授予MAN权限,我们管理所有可能的操作.