權限管理: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章