基于RESTful API 怎么設計用戶權限控制?

前言

有人說,每個人都是平等的;
也有人說,人生來就是不平等的;
在人類社會中,并沒有絕對的公平,
一件事,并不是所有人都能去做;
一樣物,并不是所有人都能夠擁有。
每個人都有自己的角色,每種角色都有對某種資源的一定權利,或許是擁有,或許只能是遠觀而不可褻玩。
把這種人類社會中如此抽象的事實,提取出來,然后寫成程序,還原本質的工作,就是我們程序員該做的事了。
有了一個這么有范兒的開頭,下面便來談談基于RESTful,如何實現不同的人不同的角色對于不同的資源不同的操作的權限控制。

RESTful簡述

本文是基于RESTful描述的,需要你對這個有初步的了解。
RESTful是什么?
Representational State Transfer,簡稱REST,是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。
REST比較重要的點是資源狀態轉換,
所謂"資源",就是網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的實在。
"狀態轉換",則是把對應的HTTP協議里面,四個表示操作方式的動詞分別對應四種基本操作:

  1. GET,用來瀏覽(browse)資源
  2. POST,用來新建(create)資源
  3. PUT,用來更新(update)資源
  4. DELETE,用來刪除(delete)資源。
RESTful CURD

資源的分類及操作

清楚了資源的概念,然后再來對資源進行一下分類,我把資源分為下面三類:

  1. 私人資源 (Personal Source)
  2. 角色資源 (Roles Source)
  3. 公共資源 (Public Source)
Sources

"私人資源":是屬于某一個用戶所有的資源,只有用戶本人才能操作,其他用戶不能操作。例如用戶的個人信息、訂單、收貨地址等等。
"角色資源":與私人資源不同,角色資源范疇更大,一個角色可以對應多個人,也就是一群人。如果給某角色分配了權限,那么只有身為該角色的用戶才能擁有這些權限。例如系統資源只能夠管理員操作,一般用戶不能操作。
"公共資源":所有人無論角色都能夠訪問并操作的資源。

而對資源的操作,無非就是分為四種:

  1. 瀏覽 (browse)
  2. 新增 (create)
  3. 更新 (update)
  4. 刪除 (delete)

角色、用戶、權限之間的關系

角色和用戶的概念,自不用多說,大家都懂,但是權限的概念需要提一提。
"權限",就是資源與操作的一套組合,例如"增加用戶"是一種權限,"刪除用戶"是一種權限,所以對于一種資源所對應的權限有且只有四種。

Permissions

角色用戶的關系:一個角色對應一群用戶,一個用戶也可以扮演多個角色,所以它們是多對多的關系。
角色權限的關系:一個角色擁有一堆權限,一個權限卻只能屬于一個角色,所以它們是一(角色)對多(權限)的關系
權限用戶的關系:由于一個用戶可以扮演多個角色,一個角色擁有多個權限,所以用戶與權限是間接的多對多關系。

Relations

需要注意兩種特別情況:

  1. 私人資源與用戶的關系,一種私人資源對應的四種權限只能屬于一個用戶,所以這種情況下,用戶和權限是一(用戶)對多(權限)的關系。
  2. 超級管理員的角色,這個角色是神一般的存在,能無視一切阻礙,對所有資源擁有絕對權限,甭管你是私人資源還是角色資源。

數據庫表的設計

角色、用戶、權限的模型應該怎么樣設計,才能滿足它們之間的關系?

Models

對上圖的一些關鍵字段進行說明:

Source
  • name: 資源的名稱,也就是其他模型的名稱,例如:user、role等等。
  • identity: 資源的唯一標識,可以像uuid,shortid這些字符串,也可以是model的名稱。
  • permissions : 一種資源對應有四種權限,分別對這種資源的browse、create、update、delete
Permission
  • source : 該權限對應的資源,也就是Source的某一條記錄的唯一標識
  • action :對應資源的操作,只能是browse、create、update、delete四個之一
  • relation:用來標記該權限是屬于私人的,還是角色的,用于OwnerPolicy檢測
  • roles: 擁有該權限的角色
Role
  • users : 角色所對應的用戶群,一個角色可以對應多個用戶
  • permissions: 權限列表,一個角色擁有多項權利
User
  • createBy : 該記錄的擁有者,在user標里,一般等于該記錄的唯一標識,這一屬性用于OwnerPolicy的檢測,其他私有資源的模型設計,也需要加上這一字段來標識資源的擁有者。
  • roles : 用戶所擁有的角色

策略/過濾器

在sails下稱為策略(Policy),在java SSH下稱為過濾器(Filter),無論名稱如何,他們工作原理是大同小異的,主要是在一條HTTP請求訪問一個Controller下的action之前進行檢測。所以在這一層,我們可以自定義一些策略/過濾器來實現權限控制。
為行文方便,下面姑且允許我使用策略這一詞。

**策略 (Policy) **

下面排版順序對應Policy的運行順序

  1. SessionAuthPolicy
    檢測用戶是否已經登錄,用戶登錄是進行下面檢測的前提。
  2. SourcePolicy
    檢測訪問的資源是否存在,主要檢測Source表的記錄
  3. PermissionPolicy
    檢測該用戶所屬的角色,是否有對所訪問資源進行對應操作的權限。
  4. OwnerPolicy
    如果所訪問的資源屬于私人資源,則檢測當前用戶是否該資源的擁有者。

如果通過所有policy的檢測,則把請求轉發到目標action。

Policies

Sails下的權限控制實現

在Sails下,有一個很方便的套件sails-permissions,集成了一套權限管理的方案,本文也是基于該套件的源碼所引出來的權限管理解決方案。

結語

對程序員最大的挑戰,并不是能否掌握了哪些編程語言,哪些軟件框架,而是對業務和需求的理解,然后在此基礎上,把要點抽象出來,寫成計算機能理解的語言。
最后,希望這篇文章,能夠幫助你對權限管理這一課題增加多一點點理解。

寫作參考


如果本文對您有用
請不要吝嗇你們的Follow與Start
這會大大支持我們繼續創作

「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容