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被分配给某人时,那么assignedTo
和assignedBy
也应该被记录.
这使得许多其他操作易于处理.
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
,然后他可以分配给任何人.
这里要记住两件事:
由于分配部分主要发生在UI(Angular )前端,我给出了判断loggedInUser.id === todos.createdById
的方法.以任何方式登录的用户都可以通过读取操作查看所有待办事项,并可以将其分配给他/她喜欢的任何人.
确保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.