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

基本需求:
一个用户可拥有多个角色,一个角色可授予多个用户
不可对用户直接授权
角色有优先级的概念,即当某个用色具有多个用色时,按优先级高低来判断权限
实现模块级控制

使用到的技术:
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代码
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实例,则说明没有对应的权限
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代码

<?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.bubugaga.oa.web.SecurityFunctions</function-class>  
    <function-signature>boolean hasPermission(int, java.lang.String,int)</function-signature>  
  </function>  
</taglib>  
页面使用:

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

转自:http://blog.sina.com.cn/s/blog_5183d2c80100iqc5.html


展开阅读全文

没有更多推荐了,返回首页