天天看點

JAVA常見的權限控制算法的實作

删除A---0

修改A---1

添加A---2

删除B---3

修改B---4

添加B---5

……

  理論上可以有N個操作,這取決于你用于儲存使用者權限值的資料類型了。

  這樣,如果使用者有權限:添加A---2;删除B---3;修改B---4。那使用者的權限值 purview =2^2+2^3+2^4=28,也就是2的權的和了。化成二進制可以表示為11100。這樣,如果要驗證使用者是否有删除B的權限,就可以通過位與運算來實作。在Java裡,位與運算運算符号為&,即是:

int value = purview &((int)Math.pow(2,3));

  你會發現,當使用者有操作權限時,運算出來的結果都會等于這個操作需要的權限值!

  原理:

  位與運算,顧名思義就是對位進行與運算:

  以上面的式子為例:purview & 2^3 也就是 28&8

  将它們化成二進制有

 11100

& 01000

-------------------

  01000 == 8(十進制) == 2^3

  同理,如果要驗證是否有删除A---0的權限

  可以用:purview &((int)Math.pow(2,0));

  即:

 11100

& 00001

------------------------

  00000 == 0(十進制)  != 2^0 

  這種算法的一個優點是速度快。可以同時處理N個權限。如果想驗證是否同時有删除A---0和删除B---3的權限,可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;設定多角色使用者。根據權限值判斷使用者的角色。

  下面提供一個java的單操作權限判斷的代碼:

//userPurview是使用者具有的總權限

//optPurview是一個操作要求的權限為一個整數(沒有經過權的!)

public static boolean checkPower(int userPurview, int optPurview)

{

  int purviewValue = (int)Math.pow(2, optPurview);

  return (userPurview & purviewValue) == purviewValue;

}

  當然,多權限的驗證隻要擴充一下就可以了。

  幾點注意事項:首先,一個系統可能有很多的操作,是以,請建立資料字典,以便查閱,修改時使用。其次,如果用資料庫儲存使用者權限,請注意數值的有效範圍。操作權限值請用唯一的整數。

來源:http://www.zxbc.cn/html/20070426/7587.html