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/

  • 相关阅读:
    【转】XP下安装IIS6.0的办法
    设计模式学习笔记十:单例模式(Singleton Pattern)
    linq学习笔记(2):DataContext
    设计模式学习笔记十二:桥接模式(Bridge Pattern)
    英文版c#数据结构
    linq学习笔记(3):Where
    一步步学习WCF(1):Hello
    linq学习笔记(5):Count/Sum/Min/Max/Avg
    [转]Asp.Net 面试题目收集
    从谷歌公司发现的十个至理名言
  • 原文地址:https://www.cnblogs.com/JamKong/p/4834536.html
Copyright © 2011-2022 走看看