我喜歡給角色的名字 - GOD,超級英雄& MAN,容易理解。
由於您正在使用MEAN堆棧,並且大多數路由驗證發生在node
上,所以我寧願讓角色表保持簡單。
角色:
{
_id : 1,
name : GOD,
golbalPerms : true
},
{
_id : 2,
name : SUPER HERO,
privatePerms : true
},
{
_id : 3,
name : MAN
}
用戶:
{
_id : 111,
name : Jesus,
roleId : 1
},
{
_id : 222,
name : BatMan,
roleId : 2
},
{
_id : 333,
name : Jack,
roleId : 3
}
當發送user
對象返回給客戶端用戶登錄,確保與DB相應role
對象來代替roleId
。
來到代碼節點上的JS:
通過完全理解你的用例,我們可以將其分爲以下方法 -
CREATEUSER
CreateTodo
DeleteTodo
ReadTodo
- UpdateTodo
CommentTodo
AssignTodo
讓去一步一步CREATEUSER。
航線的代碼片段:
app.all('/users', users.requiresLogin);
// Users Routes
app.route('/users')
.post(users.hasPerms('globalPerms'), users.create);
在你的控制器,你可以驗證基於輸入globalPerms
,如果驗證允許通過調用next()
其他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);
有關創建的Todo,globalPerms
與GOD & privatePerms
與超級英雄,它們兩者可以被允許。
把戲這裏會在todos.delete
的方法,只是確保user.id === todos.createById
否則超級英雄可能會繼續刪除上帝創造的待辦事項。
ReadTodo:
當TODO創建它應該有一個createById
同樣存儲當TODO分配給別人,然後assignedTo
和assignedBy
也應該被記錄下來。
這使得很多其他操作很容易處理。
user.role.globalPerms
- 給GOD所有TODO的數據。
user.role.privatePerms
- 給予TODO或者由他/她創建或分配給他/她。
user.role.globalPerms === undefined && user.role.privatePerms === undefined
- 它的MAN,並給TODO的只分配給他。
UpdateTodo & CommentTodo:
這是什麼ReadTODO這樣做DIY
最後一個,AssignTodo翻版:
簡單的一個,loggedInUser.id === todos.createdById
那麼他就可以把它分配給任何人。
兩件事情要記住這裏:
由於分配部件大多發生在你的UI(角)前,我已經給檢查loggedInUser.id === todos.createdById
的這種做法。以任何方式登錄用戶將通過讀取操作看到所有TODO的,並可將其分配給他/她喜歡的任何人。
確保超級英雄只能分配一個TODO給他自己或其他超級英雄或一個人,但不能給上帝。你如何顯示分配給UI前端的選項不在這個問題的範圍之內。這只是一個提醒。
希望這是明確的。
注意:沒有必要爲角色集合中的MAN授予權限&我們管理了所有可能的操作。
這是乾淨的n最好的解決方案,我可以要求使用任何第三方模塊。謝謝 :) – BeingSuman