RBAC(基於角色的訪問控制)的實現

/**
  * 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章