1. 程式人生 > >關於RBAC(Role-Base Access Control)的理解(轉)

關於RBAC(Role-Base Access Control)的理解(轉)

topic div 今天 就是 對象 配置文件 需要 需求 重新

基於角色的訪問控制(Role-Base Access Control)

有兩種正在實踐中使用的RBAC訪問控制方式:隱式(模糊)的方式和顯示(明確)的方式。

今天依舊有大量的軟件應用是使用隱式的訪問控制方式。顯示的訪問控制方式更適合於當前的軟件應用。

隱式的訪問控制

隱式的訪問控制就是並沒有給角色添加具體權限操作,只是給訪問的用戶添加了一個標識,告訴系統我是隸屬於這個角色的,只要系統允許這角色操作的資源,我就有權限去操作。

比如說,我現在某個系統有兩個角色,分別是“超級管理員”,"項目管理員",“普通用戶”;

用戶有: root 、zhangSan;

分別給上面三個用戶賦予角色:root 賦予 “超級管理員” 角色 / zhangSan 賦予 “普通用戶” 角色

那麽我現在有一個修改用戶密碼的功能,這個功能只能是“超級管理員”角色的用戶才能操作,那麽隱式訪問控制的具體代碼將會是如下:

if( currentUser.hasRole("超級管理員")){
    //有權限進行操作
}else{
   //沒有權限進行操作
}

上面這段代碼說的是,如果當前訪問用戶對象隸屬於“超級管理員”這個角色,那麽有權限進行修改用戶密碼操作,否則沒有權限進行操作。

這種權限操作是沒有明確告訴系統這個角色可以幹什麽,而是程序員知道這個角色能幹嗎,靠if else在程序中進行判斷這些角色能幹嗎。

如果此時增加一個“普通用戶”也可以修改用戶密碼的權限,那麽此時代碼就應該改成如下:

if( currentUser.hasRole("超級管理員") || currentUser.hasRole("普通用戶")){
    //有權限進行操作
}else{
   //沒有權限進行操作
}

這樣的權限管理不太好,僅僅是因為一個微小的權限方面的需求變動,就需要改動代碼,重新編譯、部署...

如果又讓項目管理員也有這樣的權限的話,又得修改了。。。

所以,推薦下面的顯式的訪問控制。

顯式的訪問控制

顯式的訪問控制是明確的告訴系統這些角色具體能幹嗎,讓隸屬於這個角色的用戶都擁有相應的權限。

如:“超級管理員”{“創建用戶”,“修改用戶密碼”,“刪除用戶”}的權限

那麽修改用戶密碼的代碼就該如下所示:

//獲取當前用戶的角色,再通過角色來判斷是否有“修改用戶密碼的權限”
if( currentUser.getRole().isPermission("修改用戶密碼")){
   //有權限進行操作
}else{
    //無權限進行操作  
}

假設我要去除掉超級管理員的“修改用戶密碼”的權限,那麽我只需要修改權限的配置文件,而不需要修改代碼部分。

所以,推薦使用顯式訪問控制。

參考資料:http://www.thinksaas.cn/group/topic/150841/

關於RBAC(Role-Base Access Control)的理解(轉)