Am currently learning MEAN堆栈,开发一个简单的TODO应用程序,并希望为此实现基于角色的访问控制(RBAC).我如何设置角色&MongoDB的许可.

我想要3个角色(角色可能看起来很有趣,但这纯粹是为了学习):

  • god
  • 超级英雄
  • 成年男子

god -与超级管理员类似,可以在应用程序中执行任何操作.C、 TODO和其他用户的R、U、D权限.可以创建待办事项&直接分配给任何超级英雄或男人.随时更新或删除待办事项或用户.

超级英雄-与管理员类似,拥有对个人数据执行任何操作的超级能力-TODO's的C、R、U、D.无法创建任何用户.只能阅读&为TODO's created by god &分配给他/她.

成年男子-只能阅读并添加对分配给他/她的TODO的 comments .

总而言之:

god - C,R,U,D [Global Level] 超级英雄 - C,R,U,D [Private] + R,U [Assigned to him] 成年男子 - R,U [Assigned to him]

我明白我需要有用户&角色集合.inturn中的角色应该具有哪些权限等.我如何将它们连接起来?

推荐答案

I like names given to roles - 100, easy to understand.

由于您使用的是MEAN stack,而且很多路由验证都是在node上进行的,所以我更希望角色表保持简单.

Roles :

{
_id : 1,
name : GOD,
golbalPerms : true
},
{
_id : 2,
name : SUPER HERO,
privatePerms : true
},
{
_id : 3,
name : MAN
}

Users :

{
_id : 111,
name : Jesus,
roleId : 1
},
{
_id : 222,
name : BatMan,
roleId : 2
},
{
_id : 333,
name : Jack,
roleId : 3
}

当用户登录并将user对象发送回客户端时,请确保将roleId替换为DB中相应的role对象.

Coming to code on Node JS :

通过完全理解您的用例,我们可以将它们分为以下几种方法-

  • CreateUser

  • CreateTodo

  • 删除托多

  • ReadTodo

  • UpdateTodo
  • comments 待办事项

  • 转让

让我们一步一步走,CreateUser.

路由代码段:

app.all('/users', users.requiresLogin);

// Users Routes
app.route('/users')
    .post(users.hasPerms('globalPerms'), users.create);

在控制器中,您可以基于输入globalPerms进行验证,如果已验证,则允许通过调用next() else return并显示相应的错误消息来创建用户.

Now CreateTodo && 删除托多 :

他们两人几乎都用一个小技巧在相同的逻辑上工作.

路由代码段:

app.all('/todos', users.requiresLogin);

// Users Routes
app.route('/todos')
    .post(users.hasPerms('globalPerms','privatePerms'), todos.create);
    .delete(users.hasPerms('globalPerms','privatePerms'), todos.delete);

要创建待办事项,globalPerms个是GOD&;privatePerms个和SUPER HERO个都可以.

这里的诀窍将在todos.delete方法,只要确保user.id === todos.createById否则超级英雄可能会继续删除god 创造的托多.

ReadTodo :

当一个TODO被创建时,它应该存储一个createById,当一个TODO被分配给某人时,那么assignedToassignedBy也应该被记录.

这使得许多其他操作易于处理.

user.role.globalPerms-把托多的数据都交给god .

user.role.privatePerms-给出由他/她创建或分配给他的TODO.

user.role.globalPerms === undefined && user.role.privatePerms === undefined-它的男人和只分配给他的托多.

UpdateTodo & comments 待办事项 :

这完全是ReadTODO DIY的复制品

Last one, 转让 :

简单一点,loggedInUser.id === todos.createdById,然后他可以分配给任何人.

这里要记住两件事:

  1. 由于分配部分主要发生在UI(Angular )前端,我给出了判断loggedInUser.id === todos.createdById的方法.以任何方式登录的用户都可以通过读取操作查看所有待办事项,并可以将其分配给他/她喜欢的任何人.

  2. 确保SUPER HERO人只能给自己或其他超级英雄分配任务,或者给一个人分配任务,而不能给god .如何在UI前端显示分配给选项超出了这个问题的范围.这只是个提醒.

希望这是清楚的.

NOTE : There was no necessity to give permissions to MAN in Roles collection & we managed all possible operations with out that.

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

数组相等条件返回的文档多于与相等匹配的文档:MongoDB

Mongoose 排除数组中包含特定嵌套对象的文档

多键索引,性能问题

MongoDB 按 created_at 月聚合

如何在 MongoDB 中已经存在的 slug 中添加一个随机数?

在mongodb中,如何使用聚合来获取字段之间的对应关系

Flask and Mongo

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

从性能Angular 来看 MongoDB 嵌入式与参考

在 Mongo 中存储嵌套类别的最有效方法?

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

MongoDB 3 Java判断集合是否存在

带有部分字符串的mongoose文本搜索

Mongo:无法在 src/mongo/shell/mongo.js:145 连接到服务器 127.0.0.1:27017

移动 MongoDB 的数据文件夹?

MongoDB 用 $type 匹配一个数组?

MongoDB打印两点之间的距离

将日期从毫秒转换为 ISODate 对象

即使重新安装后,Mongo 仍在等待 27017