权限管理:RBAC(基于角色的访问控制)的实现

基本需求: 一个用户可拥有多个角色,一个角色可授予多个用户 不可对用户直接授权 角色有优先级的概念,即当某个用色具有多个用色时,按优先级高低来判断权限 实现模块级控制
使用到的技术: spring springMVC hibernate ajax(DWR) JSTL函数
基本实现:
实体类: 用户User(id,username,...) 角色Role(id,rolename,...) 用户用色UserRole(id,User,Role,orderNo[角色在这个用户中的优先级]) 模块Module(id,url,...) 访问控制列表ACL(id,roleId,moduleId,aclState[授权状态,用其后四位(bit)来表示CRUD操作])
核心操作说明: 1、User 1)添加或更新用户拥有的角色 addOrUpdateUserRole(int userId,int roleId,int orderNo) 根据userId和roleId查询用户角色表,如果有对应的记录,则更新orderNo,如无,则创建一条新记录。 2)查询该用户拥有的所有角色 List<UserRole> searchUserRoles(int userId) 查询用户角色表中,用户ID等于userId的所有记录,返回List 2、ACL 1)查询ACL ACL findACL(int roleId, int resourceSn) 即:根据角色ID和资源ID返回ACL实例 2)授权 public void addOrUpdatePermission(int roleId, int resourceSn, int permission, boolean yes) 即:授予哪个角色对哪个资源的什么权限先根据角色ID和资源ID查询对应的ACL实例,如有,则更新,如没有,则设置其相关值

Java代码
  1. publicvoid setPermission(int permission,boolean yes){
  2. int tmp = 1
  3. tmp = tmp << permission;
  4. if(yes){ 
  5. aclState |= tmp;
  6. }else
  7. aclState &= ~tmp;
  8. }
 public void setPermission(int permission,boolean yes){ int tmp = 1; tmp = tmp << permission; if(yes){ aclState |= tmp; }else{ aclState &= ~tmp; } }

3)认证 public boolean hasPermission(int userId, int resourceSn, int permission) 即:根据用户ID查询出该用户是否对某资源具有何种权限先查询用户角色表,查询出该用户拥有的所有角色,再根据角色ID和资源ID查询ACL实例,一旦有ACL实例,则返回permission的权限,如果未发现ACL实例,则说明没有对应的权限

Java代码
  1. publicint getPermission(int permission){
  2. int tmp = 1
  3. tmp = tmp << permission;
  4. tmp &= aclState;
  5. if(tmp != 0){ 
  6. return ACL_YES;
  7. return ACL_NO;
  8. }
 public int getPermission(int permission){ int tmp = 1; tmp = tmp << permission; tmp &= aclState; if(tmp != 0){ return ACL_YES; } return ACL_NO; }

4)搜索某个用户拥有读取权限的模块列表 List searchModules(int userId)
页面认证: 使用JSTL自定义函数实现:
tag.tld

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <taglibxmlns="http://java.sun.com/xml/ns/j2ee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  5. version="2.0">
  6.  
  7. <tlib-version>1.0</tlib-version>
  8. <short-name>bubugaga</short-name>
  9. <uri>http://bubugaga.javaeye.com/oa/functions</uri>
  10.  
  11. <function>
  12. <name>hasPermission</name>
  13. <function-class>com.bubugaga.oa.web.SecurityFunctions</function-class>
  14. <function-signature>boolean hasPermission(int, java.lang.String,int)</function-signature>
  15. </function>
  16. </taglib>
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>bubugaga</short-name>
<uri>http://bubugaga.javaeye.com/oa/functions</uri>
<function>
<name>hasPermission</name>
<function-class>com.cwq.oa.web.SecurityFunctions</function-class>
<function-signature>boolean hasPermission(int, java.lang.String,int)</function-signature>
</function>
</taglib>

页面使用:

Url代码
  1. <%@ taglib prefix="mytag" uri="http://bubugaga.javaeye.com/oa/functions" %>
  2. <c:if test="${mytag:hasPermission(username,1,3) }">
  3. <a href="#">删除</a><br>
  4. </c:if>

posted on 2012-08-12 21:56  站在云端  阅读(502)  评论(0编辑  收藏  举报

导航