• 关于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/

  • 相关阅读:
    一个C# usb与mcu通信的程序,附代码
    基于C#音乐播放器(附代码)
    基于C#俄罗斯方块
    FTP方式部署Azure Web App
    微信接口小例
    基于来信码的短信通知平台
    基于Windows服务的WCF
    基于IIS的WCF
    基于.NET的Excel开发:单元格区域的操作(读取、赋值、边框和格式)
    .NET通过RFC读取SAP数据
  • 原文地址:https://www.cnblogs.com/JamKong/p/4834536.html
Copyright © 2020-2023  润新知