《玩转细粒度权限管理》 三,用户角色权限RBCA

 

第三章

用户角色权限RBCA

 

 

第一章介绍了专业细粒度权限管理软件 Metadmin 的安装。第二章讲解了对于 WEB 页面的控制。哪些页面需要登录才能访问,哪些页面不需要登录就能访问。需要登录的页面,又如何页面访问权限呢?即具有什么样角色的人才能访问。

 

本章详细讲解用户角色权限关系。这也就是 RBCA(Role Based Access Control ,基于角色的访问控制 ) 。功能级权限控制到本章为止,就介绍完毕。下章开始介绍细粒度权限控制。

 

场景介绍

基于角色控制模型已经深入人心,关系并不复杂,广泛运用于各个系统。通过给用户赋予角色、角色拥有权限的模式,达到控制用户具有权限的目的。同时,还复用了角色,这样可以让多个相同职务(或职能)的人拥有同样的角色。

 

比如:

 

  1. 张三是管理员,他可以修改系统配置参数;
  2. 李四是客服人员,他可以呼叫客户,处理客户反馈;
  3. 王五是销售人员,他可以下订单,维护客户资料。

 

RBAC 局限性

通过这种定义方式,只要拥有该权限的人,访问该资源的时候,会产生相同的效果。比如:李四是北京客服人员,而洪七是上海客服人员,他们呼叫的客户范围是不同的。

如果,定义北京客户人员,上海客户人员 2 种角色,那么如果有多个地方,这维护起来太费力。

如果,给李四和洪七的用户名下,分配资源。就是有些网友提出的解决方案:用户--资源表。那么每个用户都要维护一次,每个客户维护一次,这更费力。

显然上述两种方案,都不可取。因为,这些都属于细粒度、数据级的权限控制, RBAC 模型无能为力。这种细粒度控制下章开始介绍。

数据库模型

基本信息表

权限定义,要包含以下几大类信息:

1, 该权限的基本信息;

2, 一般会将整个系统权限看成一棵树,该权限在权限树上的位置;

3, 该权限对应的资源,一般为 WEB URL

 

那么权限表有这么几个字段: id, name, description, parented, url, target

 

角色定义非常简单: id, name, description

 

用户表就不多说了,这是一个业务领域的表。不同系统,用户表结构是不一样的。

权限关系表

角色、权限关系表: id, privilegeId, roleId ,一个角色可以拥有多个权限,一个权限可以被多个角色拥有,多对多关系。

 

用户、角色关系表: id, userId, roleId ,同样是多对多关系。

判断逻辑

指定用户、指定权限,判断该用户是否拥有该权限。

select roleId from 用户、权限管理系表 where userId=? and roleId in( select roleId from 角色、权限关系表 where privilegeId=?)

如果有记录,表明该用户拥有该权限,否则表示不拥有。

如果使用 Metadmin

Metadmin 是细粒度权限管理中间件,可以在 www.metadmin.com 下载试用版。以下界面均引用下载程序包里面的演示示例。

 

在安装用户元数据文件的时候, Metadmin 会自动创建相关权限表(权限表、角色表、权限角色关系表、角色用户关系表)。在 RBAC 控制方面, Metadmin 提供如下服务:

1, 自动创建相关数据库表;

2, 维护权限、角色、给用户授权,整套后台程序以及前台界面;

3, 提供权限认证 API ,供业务系统调用。

开发者只要在业务方法里面调用 API 即可,不需要做任何程序开发。

 

权限界面及常量导出

权限维护界面:树形结构

 

 

权限定义维护界面:输入项参数

 

 

常量导出界面:导出定义的权限,开发者将这些常量放入自定义的常量类里面,方便以常量的形式引用各种权限。

 

其他界面

其他管理界面,创建角色、给角色分配权限,给用户分配权限。这些没有什么特殊之处,仅贴出给角色分配权限界面,其他不再多说了。

给角色分配权限界面:


API

就功能权限方面, Metadmin 提供如下 2 API

MetadminService 类:

static boolean

hasPrivilege (int privilegeId, User  user) 
          判断指定用户是否拥有指定的权限

 

WebMetadminService 类,更方面给 WEB 程序调用的,自动从 req 里面读取用户:

static boolean

hasPrivilege (HttpServletRequest req, int privilegeId) 
          判断指定用户是否拥有指定的权限

 

完整 API 可在线浏览: http://www.metadmin.com/doc/javadoc/index.html

Metadmin 对于应用安全的考虑

细心的读者,肯定会问:

1, 给用户分配角色是业务管理职责,创建角色、权限,维护角色、权限关系是系统管理员职责。这样笼统的提供一个界面,让大家都能使用,这种做法不可取。

2, 即便是给用户分配角色,不同业务管理员可以分配的用户范围是不同的。

 

是的, Metadmin 对此持有相同看法。为此, Metadmin 预定义了 3 个权限:角色管理、给用户分配角色和策略管理三种角色。

如图示:


 

拥有“角色管理”权限的用户,可以增加、删除、修改角色,维护角色拥有的权限;

拥有“给用户分配角色”权限的用户,可以管理用户具有的角色。至于该用户能够查看到哪些用户, Metadmin 也预留了控制功能。如何控制在此暂时不表。

拥有“策略管理”权限的用户,能够进行细粒度权限管理工作,制定权限策略。如何制定权限策略,以后章节会逐步介绍。

 

为了让对 Metadmin 界面访问权限生效,还需要对 web.xml 进行修改。将 secured 参数值由 false 改为 true

如图示:

你可能感兴趣的:(《玩转细粒度权限管理》 三,用户角色权限RBCA)