由于要做公司的一个权限系统相关的任务,又开始重拾RBAC了,不过一直以来对权限系统就比较的感兴趣,因为这确实是无论什么系统中的重中之重,一个灵活的权限系统将使得系统变得简单易用,并且控制性极强。
RBAC:Role Based Access Control,翻译过来基本上就是基于角色的访问控制系统,ACL:Access Control List,访问控制列表,是前几年盛行的一种权限设计,它的核心在于用户直接和权限挂钩。RBAC的核心是用户只和角色关联,而角色代表对了权限,这样设计的优势在于使得对用户而言,只需角色即可以,而某角色可以拥有各种各样的权限并可继承。ACL和RBAC相比缺点在于由于用户和权限直接挂钩,导致在授予时的复杂性,虽然可以利用组来简化这个复杂性,但仍然会导致系统不好理解,而且在取出判断用户是否有该权限时比较的困难,一定程度上影响了效率。
RBAC的使用,个人认为RBAC在使用时在管理程序的表现为首先创建一个角色,对该角色授权,给用户授予此角色使得用户拥有该权限。权限系统的基本概念就是谁对谁进行某操作的权限,其中第一个谁指的是操作者,通常即为用户id,而第二个谁通常是指资源id,如部门id呀等等,操作则通常指的是删除、修改、查看等权限,角色的概念在我的理解就是资源id和操作的组合,两者组合构成了权限,然后用户只需属于此角色即可进行操作。鉴于此种理解,系统的权限系统设计为:
1、管理程序。在管理程序中首先通过名称空间的方式配置系统中可用的资源,如部门等等;在角色管理部分配置增加角色,并给角色进行资源和操作的授予;在用户管理中给用户授予角色。
2、应用程序中的权限认证。在应用程序中判断用户是否拥有某权限可使用如下步骤进行检验,首先取出执行此操作所需要的最小的资源+操作权限所对应的角色,然后判断用户是否拥有此角色权限,这好像有点是RBAC中所说的最小权限,我对RBAC中的这个一直不太理解。
以上简单的描述了一个权限系统的设计,当然在真正开发时就更为复杂了,需要考虑比较多的东西了。在应用程序中的权限认证目前基本采用的都是proxy模式去实现,因为现在觉得采用AOP还有太大的风险,而且自己也没想清该怎么用AOP实现,还是继续用成熟的proxy模式实现好了。