應用系統許可權表示的演算法技巧

2021-04-02 23:33:20 字數 1649 閱讀 7226

應用軟體系統許可權問題的另類解決方法

許可權管理確是個很麻煩的問題

例如,乙個系統中,有n個模組,每個模組有新增,刪除,修改,完全控制,列表等許可權

有n個使用者,現在的問題是,通常,我們會建立乙個資料表來表示許可權分配,這個資料表的一般形式是

使用者id  新增 刪除 修改 完全控制

3          0    1       1    3

這樣一般來說沒什麼問題,突然有一天,你需要有一種新許可權例如叫做執行,這時候,問題就來了,你得更改資料表,新增對應的字段呀,不光如此,

程式中的邏輯也有問題了

當然,也有更聰明的兄弟使用另一種設計方法,就是包含式許可權設計,類似windows系統中,每一種許可權,將包含前一種許可權,例如

讀取是最基本的,執行包含讀取,列表包含執行,修改包含列表以此類推,用數字表示就是

讀取 1

列表 2

執行 3

修改 4

刪除 5

....

以此類推,這樣,就將第一種方法的擴充套件問題解決掉了,當有新的許可權時,在應用程式中,為其指定乙個新的權值就可以了,在實際判斷許可權中,例如

,判斷有無修改權,就比較使用者許可權值是不是大於或等於4,就可以了

聽起來不錯,似乎解決了問題,但是,再想想看,不對,這個設計的確使許可權的擴充套件性強了,可是,也使許可權體系的靈活性降低了,為什麼呢?假如,有

乙個使用者,我想給他讀取,修改兩種許可權,而不想給他執行和列表許可權,這下怎麼辦呢?這個設計是等級制的許可權,許可權具有自高往低的包含,因此,

根本無法實現這種自由組合

難道真的沒有辦法了嗎?

no!每一種許可權,相當於一種開關,也就是乙個bit,假如我們將這些許可權,每一種許可權用一位表示,那麼,整個許可權體系,不過是個bit序列而已,也就是

說不過是二進位制的011010而已,這樣一來,就好解決問題了

同樣的問題,我們這樣假設:

第一位 表示 讀取

第二位 表示 執行

第三位 表示 修改

第四位 表示 刪除

......

以此類推,假如,我們想給乙個使用者分配執行和修改許可權,其他許可權都不給予,於是,他的許可權字串可以表示為:0110,這樣,用若干個位的組合,我

們就解決了許可權的靈活組合問題(位組合這種解決方案,真是比比皆是,其實,他就是一種資料結構而已,我們叫他union?)

另外一方面呢?如何擴充套件?擴充套件就更容易了,當新增新的許可權時,可以直接在高位加上一位即可

如何判斷有無某許可權呢?我們可以直接取某位的值,根據其0,一來判斷即可

最後,實際上,c/c++/c#中,你可以做得更棒,那就是定義乙個列舉型別,例如:

enum rights

這樣的好處是用名字來引用許可權,就更好了

判斷許可權時,可以使用按位與,例如,使用者許可權為100001

而執行需要的許可權是1000

兩者按位與的結果是00000000,顯然無此許可權,用公式表示就是

rn & r=rn,則代表使用者有此許可權,我的意思是

所需許可權&使用者許可權=所需許可權  符合此條件,即表明有許可權

寫的比較抽象,但是,相信有許可權設計經驗的朋友一看就明白了

我也是在最近設計乙個系統時,被客戶的變化逼的不行,後來,受《程式設計珠璣》一書中第一章關於對100萬個**號碼進行排序的文章中受到的啟發

bw:c#中的union結構原來是取消了-:(

Linux中的許可權表示 字母表示和數字表示

linux 的許可權控制對比windows 一直是為人稱道。在linux 系統中檔案和目錄都有對應的許可權,典型的許可權表示如下 r r r rw rw r r rw rw rw rwx rwxr r rwxr xr x rwxrwxrwx linux 使用9位字母來表示許可權,當使用命令ls 時會...

mysql 系統許可權 MySQL 的許可權系統

create user liub localhost identified by liub create table g user id varchar 10 username varchar 20 userpwd varchar 20 insert into g user values 1 liu...

逆波蘭表示的應用

逆波蘭表示式又叫做 字尾表示式 在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。逆波蘭表示式最常應用的場景是用於四則運算...