1. 程式人生 > >基於角色與基於資源的權限訪問控制

基於角色與基於資源的權限訪問控制

由於 同時 style ssi 語句 span 權限 分配 不依賴

  基於角色的權限訪問控制RBAC(role-based access control)是以角色為中心進行的訪問控制,也就是判斷主體subject是那個角色的方式進行權限訪問控制,是粗粒度的

  基於資源的權限訪問控制RBAC(resource-based access control)是以資源為中心進行的訪問控制,只需要為角色添加權限就可以

  區別:

    由於基於角色的權限訪問控制的角色與權限往往是多對多的關系(比如admin角色可以所有CURD的權限,部門經理角色有Retrieve權限,這就是多對多關系了),如果角色所對應的權限發生變化 ,那我們所編寫的判斷邏輯就必須發生改變,可擴展性差

      比如:原本只有admin可以訪問,那麽判斷可以這麽寫

      if(role.equals(”admin”)){

        //retrieve

      }

      但是假設後期需要給部門經理角色也賦予retrieve權限,那麽必須改變原有代碼,或者另外增加代碼,總之要改變原有的判斷邏輯

      if(role.equals("admin") || role.equals("manager")){

        //retrieve    

      }

    如果是基於資源的權限訪問控制,資源和權限一對一關系比較常見,很多時候資源和權限在數據庫中會被合並在一張表中,只需要為資源分配相應的權限。所以一個具體操作對應的權限,只要直接判斷用戶是否擁有該權限即可,可擴展性強

      //判斷用戶是否具有查看權限,用戶的角色可以任意變化,而這條判斷語句始終是可行的

      if(user.hasPermission("retrieve")){

        //retrieve 

      }

      如果用戶的權限需要改變,只需要對數據庫中用戶的角色對應的權限進行改變,而權限與對應資源通常不會有改變的需求

  不過使用基於資源的方式,仍然是需要角色的,用戶的權限分配的依據往往是角色(比如:如果我給你admin角色,那麽同時也會給你curd的權限)。而進行訪問控制時,則不依賴角色(比如:你想查看 ,那麽我可以直接問你你有retrieve權限嗎?如果有,你就可以訪問。而不關心你是什麽角色)。

基於角色與基於資源的權限訪問控制