zoukankan      html  css  js  c++  java
  • 关于RBAC(Role-Base Access Control)的理解(转)

    基于角色的访问控制(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/

  • 相关阅读:
    联赛模拟26_Lesson5!(拓扑+最长路径树)
    联赛模拟27_地理课
    联考day7_树和森林(lct.cpp)
    CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths —dsu on tree
    O(m^1.5)寻找三元环
    未对参数做非空校验,我的服务被搞得内存溢出了!
    想法随写:推动与拉动 and 百思得解 and 学会扭转被动局面
    http code:502 Bad Gateway
    java.lang.reflect.Filed.class中setInt与set的区别
    dubbo提供者停止服务后zookeeper注册中心节点仍然存在
  • 原文地址:https://www.cnblogs.com/leodaxin/p/8350814.html
Copyright © 2011-2022 走看看