標籤:
角色型存取控制(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)的理解