假設我們有一批使用者的許可權資訊,分為4類許可權a,b,c,d。如何設計一種能夠快速識別身份許可權的資料結構呢?
首先我們先要對使用者與許可權建立一種對映關係,也就是 使用者-許可權資訊。
我們可以採用key-value的形式進行儲存,由於我們主要是做許可權認證,所以先調整個方向。 許可權資訊作為key, 使用者表示作為value。
首先我們可以想到用hashmap來儲存,hashmap《使用者資訊,許可權資訊》,接下來就是設定許可權資訊的格式了,我們可以先簡單的定義使用者資訊 就是乙個 long型別的id,許可權資訊就是一串字串,由「許可權標識「」和「_」組成,例如這樣 「a_b」 這就代表有2中許可權a,b.
但是這樣有個問題,如果我們需要對某一類擁有指定許可權的使用者進行篩選就很麻煩。
假設現在有n個使用者 m個方法
首先,我們先要遍歷n個使用者,然後對每乙個使用者的許可權資訊根據"_"字元進行拆分,然後在拆分的方法陣列中進行遍歷,從而找到特定使用者。所耗費的次數為m * n。
可以明顯的感覺到n其實是多餘的。但是由於我們許可權資訊的資料格式設計的不合理,導致了我們需要進行這個n次比較。接下來我們就要想辦法對許可權資訊的資料格式進行優化,使它1次就可以比較出是否含有指定許可權。
一種緊湊的資料結構,就是位。 我們將許可權資訊用long這種型別來記錄,而我們知道long一共有64位,那麼我們就可以用它來表示64中狀態。
乙個簡單的例子,
先定義許可權資訊
/**
* @author: tangfenqi
* @description: 定義一些許可權列舉
* @date:2020/1/16 15:45
*/public
enum authenum
}
下面分別來展示 許可權的增加,刪除,查詢,包含如何做。
用來儲存使用者與許可權資訊的關聯關係
private map
auth_map =
newhashmap
<
>()
;
1.增加
private
synchronized
void
add(
long id,
long addvalue)
else
}
只需要將值相或就行了。
2.刪除
private
synchronized
void
deleted
(long id,
long removevalue)
刪除比較麻煩的一點就是,有可能傳入的許可權你本來就沒有,所以不能直接異或,先要相與把不存在的許可權位給歸0,然後在異或將對應位置歸0.
3.是否包含許可權
private
boolean
contain
(long id,
long value)
進行相與,如果包含則其結果值就等於請求值。
4.獲取使用者許可權
private list
findauth
(long id)
}return authenums;
}
我這定義了乙個列舉,列舉裡面的值就是許可權的值。
像這種緊湊的資料型別在實際的使用場景下還是有不錯的發揮的,算是一種小技巧把。
許可權系統之RBAC設計 基於角色的許可權認證 思想
rbac模型 role based access control 基於角色的訪問控制 模型是20世紀90年代研究出來的一種新模型,但其實在20世紀70年代的多使用者計算時期,這種思想就已經被提出來,直到20世紀90年代中後期,rbac才在研究團體中得到一些重視,並先後提出了許多態別的rbac模型。其...
基於鎖的併發資料結構
可以使用細粒度的鎖來減小佇列的臨界區,這裡使用了乙個dummy node用來進一步減小鎖的臨界區。若要判斷佇列是否為空,只需要執行下述判斷 head.get get tail 請注意,因為在進行push的時候需要修改tail,所以對tail的訪問和修改都需要進行加鎖。這裡使用get tail來封裝這...
基於C 學資料結構
資料結構是相互之間存在一種或多種特定關係的資料元素的集合。資料元素 是組成資料的,有一定意義的基本單位,又叫做記錄。坦克物件 資料項 資料元素由多個資料項組成,是不可分割的最小單位。坦克x,y,速度 邏輯結構 資料元素之間的邏輯關係稱為資料的邏輯結構。集合結構 資料元素除了同屬於乙個集合外,它們之間...