1、權限值的設定
用二進制來表示權限值應該是按位來設置,每個位占一個,表示一種權限,如:
00000001表示十進制1,
00000010表示十進制2,
00000100表示十進制4,
00001000表示十進制8;
依次類推,才能清晰正確的標識,多種權限的賦予則使用“或運算”,此時各位比較混亂,如00000011表示十進制3,此時它意味着擁有兩種權限。
Long userrolevalue ;//用戶的權限值,根據他屬於的權限組,這個值會不同
Long oprolevalue ;//一個操作的權限值,根據他屬於的權限組,這個值會不同
2、權限的賦予(或運算)
userrolevalue = userrolevalue | oprolevalue
假設一個用戶u1,他的初始權限值為0(00000000)。如果要指定他有經理的權限,經理的權限值為4(00000100),在第三個二進制位為1。
很顯然,userrolevalue = 0 | 4 ,值為4,如果u1要同時具有文員、主管、經理的權限呢,
userrolevalue = 0 | 1 00000000 | 00000001 = 00000001
userrolevalue = 1 | 2 00000001 | 00000010 = 00000011
userrolevalue = 3 | 4 00000011 | 00000100 = 00000111
這樣,第1、2、3位都是1了,用 “或”的好處就是只改變指定位的值,如果用戶已經有了該權限,直接簡單的用加法來做會出錯,而用"或"再賦予一次,也不會出錯,如下:
userrolevalue = 7 | 4 00000111 | 00000100 = 00000111
3、權限的除去(求補、與運算)
userrolevalue = userrolevalue & (~oprolevalue)
假設一個用戶u1,他的初始權限值為7(00000111),說明他能做文員、主管、經理權限組所能作的所有操作。如果不想讓他有主管權限組能作的操作呢,那么,就要把他的權限值變為00000101,而主管權限組的權限值是00000010,顯然簡單的用減法,肯定也是不行的,但是先對00000010作補運算,可以得到11111101,再同00000111作與運算,就得到了00000101,這樣就只對第二位作了改變,不會影響到其它位,我們的目的也就達到了。
對於一個操作,哪些權限組能操作它,也可以用與運算來做,不讓某些權限組有些操作的權限,也可以先求補,再作與運算來解決。
4、權限的驗證(與運算)
(userrolevalue & oprolevalue) != 0表示擁有oprolevalue所表示權限
例如:現有一個用戶User的權限為6(00000110),通過&(與)運算,使用公式 "(User的權限 & 權限值) != 0" 即可判斷擁有某個權限值表示的權限----6 & 2 == 2 (00000110 & 00000010 == 00000010),表示User擁有主管權限;6 & 4 !=0 (00000110 & 00000100 == 00000100) ,表示User擁有經理權限;6 & 1 == 0(00000110 & 00000001 == 00000000),表示User無文員權限;