/** * acl實例跟主體和資源關聯 * 針對此實例進行授權:某種操作是否允許 * @param permission 只可以取值0,1,2,3 * @param yes true表示允許,false表示不允許 */ public void setPermission(int permission,boolean yes){ int tmp = 1; //tmp的二進制形式向左移動permission個單位 //這樣經過移動的結果會有四種情況: C:0001 R:0010 U:0100 D:1000 tmp = tmp << permission; if(yes){ //如果是授權,則把原有的權限與當前的權限相加,二進制用"|" aclState |= tmp; }else{ //如果是減去授權,則當前傳進來的權限取反,再與原有的權限"&" aclState &= ~tmp; } } /** * 獲得ACL授權(獲得C/R/U/D的權限是否允許或是否確定) * @param permission C/R/U/D權限 * @return 授權標識:允許/不允許/不確定 */ public int getPermission(int permission){ //如果繼承,則返回未定的授權信息 if(aclTriState == 0xFFFFFFFF){ return ACL_NEUTRAL; } int tmp = 1; tmp = tmp << permission; //只要C/R/U/D中不全部爲沒有權限(0000),那麼與剛剛傳入的權限相"&"是不會出現等於0的. tmp &= aclState; if(tmp != 0){ return ACL_YES; } return ACL_NO; } ------------------------------------------------------------------------------------------- WebOA系統權限管理中設置CRUD及其相關的思想 對某個模塊的權限主要包括以下四種操作: C----------Create添加 R----------Read讀取 U----------Update更新(修改) D----------Delete刪除 權限管理模塊中,這四個操作是由一個叫做Permission的類來表示的,它的屬性只有由四個已定義好的常量 CREATE = 0 READ = 1 UPDATE = 2 DELETE = 3 下面主要是關於如何設置這四種操作的說明。 闡述幾個變量的含義: aclState-----表示授權狀態,一個整型的最後四位表示,即含有哪幾種操作的整形數值,存儲在數據庫中爲32bit的整型變量 【由1、2、4、8四個數字或他們某幾個的和組成,可能的值有1~15】 permission-----CRUD操作,只能取值0、1、2、3其中之一 aclTriState-----繼承的狀態,0表示不繼承,-1表示表示繼承 【由於授權包括直接給用戶授權和給角色授權,不繼承表示直接授權、繼承則表示用戶擁有某些角色的授權】 ACL_YES-----授權允許 ACL_NO-----授權不允許 ACL_NEUTRAL-----授權不確定 【注:授權允許與否是指aclState的值中是否含有某種操作permission(CRUD)】 用於設置權限的ACL.java(訪問控制列表Access Control List)類中的主要方法 /** * acl實例跟主體和資源關聯(實際上就是設置aclState的值) * 針對此實例進行授權:某種操作是否允許 * @param permission 只可以取值0,1,2,3 * @param yes true表示允許,false表示不允許(添加還是不添加這其中某個操作C/R/U/D) */ public void setPermission(int permission, boolean yes){ int tmp = 1; tmp = tmp << permission; if(yes){ aclState |= tmp; }else{ aclState &= ~tmp; } } /** * 獲得ACL授權(根據permission判斷aclState是否含有某個操作C/R/U/D) * @param permission C/R/U/D權限 * @return 授權標識:允許/不允許/不確定 */ public int getPermission(int permission){ //如果繼承(-1),則返回不確定的授權信息 if(aclTriState == 0xFFFFFFFF) { return ACL_NEUTRAL; } int tmp = 1; tmp = tmp << permission; tmp &= aclState; if(tmp != 0) { return ACL_YES; } return ACL_NO; } /** * 設置本授權是否是繼承的 * @param yes true表示繼承,false表示不繼承 */ public void setExtends(boolean yes){ if(yes){ aclTriState = 0xFFFFFFFF; }else{ aclTriState = 0; } } 分別解釋上面三個方法 1、setPermission(int permission, boolean yes)設置操作是否允許 即將傳入的permission設置到aclState的值中:添加某操作還是去除某操作。 定義臨時變量tmp=1,然後tmp左移permission位(0、1、2、3位) 添加的話:aclState |= tmp; 即aclState與tmp作或(|)運算並返回值 去除的話:aclState &= ~tmp; 即aclState與tmp取反後作與(&)運算並返回值 例如: 若原來aclState的值爲12(二進制即位1100,含有U和D操作),現在若要添加R(1) 1. tmp(0001)左移1位,即現在tmp爲0010 2. aclState(1100)與tmp作或運算,即1100 | 0010 ,結果是1110,即爲添加R操作後aclState的值了(十進制爲13,加上了R操作) 若原來aclState的值爲12(二進制即位1100,含有U和D操作),現在若要去掉已有的U(2) 1. tmp(0001)左移2位,即現在tmp爲0100 2. tmp取反後~tmp爲1101,aclState(1100)與1011做和運算,即1100 & 1011 ,結果爲1000,即爲去掉了U操作aclState的值(十進制爲8,去掉了U操作) 2、getPermission(int permission) 獲得ACL授權 即根據permission判斷aclState是否含有某個操作C/R/U/D),返回 允許/不允許/不確定 的整型值 1. 若aclTriState爲-1,表示用戶的授權時繼承自角色的,故其是否含有permission操作不確定ACL_NEUTRAL; 2. 若aclTriState不爲-1,表示用戶的權限是直接授予的。定義臨時變量tmp=1,將其左移permission位,並與aclState作與運算,判斷其值是否爲0:若不爲0,則表示原aclState中含有傳入的permission操作;若爲0,則表示原aclState中不含有傳入的permission操作。 例如: 若原來aclState的值爲12(二進制即位1100,含有U和D操作),現在若傳入的permission爲2(即判斷是否含有U操作),且是繼承的。 1. tmp(0001)左移2位,即現在tmp爲0100 2. tmp與aclState(1100)作與運算,即1100 & 0100 , 結果爲0100(十進制爲4),不爲0,故此斷定:值爲12的aclState必含有U(2)操作。 若原來aclState的值爲12(二進制即位1100,含有U和D操作),現在若傳入的permission爲1(即判斷是否含有R操作),且是繼承的。 1.t mp(0001)左移1位,即現在tmp爲0010 2.tmp與aclState(1100)作與運算,即1100 & 0010 , 結果爲0000(十進制爲0),爲0,故此斷定:值爲12的aclState必不含有R(1)操作。 3、setExtends(boolean yes) 設置本授權是否是繼承的 是繼承-----將aclTriState設置爲-1; 不繼承-----將aclTriState設置爲0。 ============================================================================================ T_MODULE表: 後臺菜單樹模塊 ,id name url targ parentid T_ROLE: id name, T_ACL(ACCESS CONTROL LIST): id resourcesn(resource serialnumber)對應頁面模塊ID aclstate (擁有相對應模塊的權限) ROLEID 角色 ID t_userrole id , roleid , userid t_user id , username, password, person , adminstate, delstate
RBAC(基於角色的訪問控制)的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.