從實務應用出發 – 如何透過二進位控管人員權限

今天來講個有關二進位的實務運用(人員權限控管),也是筆者第一個接手的案子用到的技術

CRUD

這幾個字相信大家都不陌生吧,如果不認識的話那改為中文的「增刪查改」呢?

是電腦中常見的四個動作(更為詳細的還請參照維基)

那我們這次就以這四個動作針對人員權限控管來舉例

CRUD - show in binary

可以看到位數從右到左分別就是CRUD、跟二進位的位數

二進位換算成十進位的方式,這裡就不特別解釋了,詳情可參考維基

那開始正式進入範例

範例說明

#1. 權限控管-設定

小明是一名資深的銀行業務部專員,具以下權限   「讀取」 、「建立」

那我們該怎麼表示呢

範例1 、Example1 權限控管-設定

對應第一章圖的總表,大家應該可以輕鬆得出這個答案吧 (二進位表示 0011、十進位數字則為 3 )

至於U跟D則是他沒有的權限所以均為 0

#2. 權限控管-判斷

某天,神秘黑衣人找上小明,想要請他幫自己調整帳戶金額 ,成功的話可以給他一大筆錢

於是小明登入官網嘗試看看修改資料(想也知道他沒有這個權限)

範例2 、Example2 權限控管-判斷

判斷是否有權限是要用AND來進行計算 ➜ 兩個都要1才會為1

範例2 、Example2 權限控管-判斷 SQL Example

而二進位的計算在SQL中是可以直接這樣子表示,各語言也均有類似的

計算出來的答案為 0 ,故沒有成立(成功有權限的話,結果應該要為 0100 = 22 = 4 )

自然改不了黑衣人的資料

#3. 權限控管-增加

沒辦法達成黑衣人需求,小明只好直接找上網管,一口氣就要求所有權限

再經過一番死纏爛打之後,網管最終還是同意了幫他新增「U修改」及「D刪除」的權限

範例3 、Example3 權限控管-增加

要新增權限的話,要用到二進位中的OR 來進行合併 ➜ 任一一個有1 就為1

範例3 、Example3 權限控管-增加 - SQL Example

#4. 權限控管-減少

擁有所有權限的小明就可以改動帳戶的金額了,幫了黑衣人而且拿到一大筆錢

不料終究紙包不住火,在內部財務稽核的時候還是東窗事發了…

老闆念在小明沒有功勞也有苦勞,決定只留給他「R查看」 的權限

範例4 、Example4 權限控管-減少

這裡用到的是二進位的XOR 位元互斥來計算 ➜ 兩個都為1則計算為 0

範例4、Example4 權限控管-減少 - SQL Example

可以看到在經過處理之後,小明最終剩下的權限只剩下查看了 (0010 = 21 = 2)

優點及其限制

想到判斷權限,第一個會想到的架構應該會是,一個權限對應一個欄位吧

舉例如下,假設有多個功能要做限制 (Y/N表示有無此權限)

資料庫範例(不用二進位)
資料庫範例

看起來確實不錯,但要是功能一多就必須要開同等數目的欄位,是不是有一點麻煩

那如果用剛剛講到的二進位來表示呢

資料庫範例(使用二進位控管)

看起來是不是簡單了很多!

優點

  • 可用單一欄位儲存多種資料

限制

  • **受限於數據類型
  • 資料不直觀,需透過權限二進位字典對應 (像是範例最前面的圖1,告知各權限與二進位關聯,可能用DB另一張Table來儲存)

這裡講解一下受限於數據類型的意思,舉例來說Auth 權限欄位設定為Integer

Integer最大值為 232-1,故最多只能儲存32個權限


結論

這裡來整理下上面所說的動作及二進位計算的關聯表

權限動作計算方式
判斷AND
新增OR
減少XOR
針對二進位權限動作的計算方式

這次講解完二進位的權限控管,但其實還是要根據不同的情境來考慮使用

像是若是頁面僅有兩、三個權限,且不會經常更改,那直接用欄位儲存不用二進位計算,可能在效能上反而更好

"Human beings rarely do things for a binary reason"
                                                                                                                Laura Kuenssberg

封面照片 : Photo by Danielle Rice on Unsplash

最新資訊文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *