許可權認證 基於緊湊的資料結構

2021-10-02 06:01:21 字數 1735 閱讀 6147

假設我們有一批使用者的許可權資訊,分為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,速度 邏輯結構 資料元素之間的邏輯關係稱為資料的邏輯結構。集合結構 資料元素除了同屬於乙個集合外,它們之間...