基于角色与基于资源的权限访问控制

时间:2021-12-31 15:29:55

  基于角色的权限访问控制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权限吗?如果有,你就可以访问。而不关心你是什么角色)。