Skip to content
xautlx edited this page Jul 31, 2013 · 1 revision

总体说明

整个框架采用经典的RBAC基于角色的访问控制模型,并结合linkSpring Security 实现尽量灵活可配置的权限控制逻辑。

主要对象定义

Privilege:权限对象,主要是定义整个系统需要进行控制的权限资源,目前框架设计为指Web层面的权限资源定义,如URL、Button等, 从简化设计和Web应用的特色角度,主要把所有的URL访问(Button按钮其实本质上最终也会转化为URL请求)控制到位,其后端的Service、Dao等方法调用也可以认为基本安全覆盖,因此暂未引入基于Method方法级别的控制模型。

Role:角色对象,角色与权限以多对多关联,按照业务需求定义角色并分配关联的权限集合。系统默认定义一个ROLE_ADMIN角色为超级用户角色,系统会自动为此角色分配所有权限,主要用于初始化创建的超级用户关联。

User:用户对象,用户与角色以多对多关联,递归得到所有关联角色的关联权限并集。

Menu:菜单对象,系统基于当前登录用户关联的角色、权限等动态计算其显示的菜单项,基本的思路是每个菜单项会有个MenuUrl,通过计算可得到当前用户所有关联可访问的PrivilegeUrl集合,通过循环进行正则匹配判断,可以计算出当前用户拥有哪些菜单MenuUrl访问权限, 从而动态剔除掉没有访问权限的菜单项以及没有任何菜单项的空菜单组,形成当前登录用户的动态菜单列表。

Button/Text:受控UI元素,除了动态控制菜单,比较常见的需求是根据当前用户权限动态的Hidden或Disabled一些UI元素,如Button操作按钮,框架提供了一个权限控制标签封装,示例: <s2:privilege code="P001">受控HML内容,如按钮、文本等</s2:privilege>

整个权限控制逻辑考虑必须比较严谨,看到过的一些比较典型的系统权限设计问题:根据一定的规则简单的把菜单项或按钮过滤隐藏了,但是其对应的URL并没有实实在在的进行保护控制,用户只需要简单获取到并手工输入被隐藏项对应URL,就可以大摇大摆的访问“本来没有权限的”的功能页面。 本框架采用严格的“白名单”原则,所有没有明确定义的URL都作为受控请求,有几点逻辑或规则说明如下:

  • 所有拥有内置ROLE_ADMIN角色的用户拥有所有权限;
  • 所有登录用户默认都会自动分配属于一个内置ROLE_ANONYMOUSLY角色,此角色用户有权访问所有开放的权限: 所有在Controller方法上面注解标记SecurityControllIgnore对应的URL
  • 其余所有权限会强制赋予内置ROLE_PROTECTED角色,从而防止其他任意URL收到非法访问
  • 定义权限时有个"排序号"的概念,按照Spring Security的优先级规则,所有排序号高的URL会优先进行权限匹配检查,因此对于存在嵌套包含的权限数据,请注意把匹配度更高的权限记录的排序号设定高于匹配度更低的,如/sys/user!doUpdate的排序号应该高于/sys/user
  • 权限URL定义有通配符概念,如/sys/user会默认转化为/sys/user**模式,意思拥有此项权限角色的用户,有权访问/sys/user!doCreate,/sys/user!doUpdate等一系列URL请求

权限管理功能说明

配置权限列表: 列表和管理所有用户定义的权限数据,可独立进行基础权限配置管理

系统URL权限汇总: 基于Struts2的所有Controller定义计算整个应用所有方法(排除SecurityControllIgnore注解的方法)对应的URL集合,并通过与“配置权限列表”中定义的权限集合进行比对判断,使管理员可以全局的查看整个应用所有应该进行保护的URL权限列表以及那些URL已经配置了权限数据那些还未定义匹配的权限数据。 在其功能页面下有两个操作按钮:

  • 批量创建权限: 管理员查看到某些权限认为有必要对每个URL进行各自独立的控制,则可以选择相关计算的权限数据项,基于当前URL批量创建对应的权限数据将记录,之后可在“配置权限列表”下对这些权限进行管理;
  • 参考创建权限:此功能常用于更粗狂的统配权限创建,只能选取其中一个表格行项,点击进入一个类似权限编辑创建界面,可以在此基础上修改URL字符串,如默认带入的/sys/user!doUpdate,则可修改为匹配度更广的字符,如/sys/user,这样参考创建一条权限数据后,再刷新界面会发现由于通配符规则/sys/user!doCreate,/sys/user!doUpdate,/sys/user!doCreate,/sys/user!doDelete等计算出来的URL权限项已成为受控项

因此简单的说,“批量创建权限”常用于比较精确的权限数据初始化,“参考创建权限”常用于统配模式的权限数据数据初始化,所有通过这些操作创建的数据本质上和在“配置权限列表”添加的数据是一样的,只是一个方便管理使用的快速创建入口。

Clone this wiki locally