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

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

[color=red]使用到的技术:[/color]
spring
springMVC
hibernate
ajax(DWR)
JSTL函数

[color=red]基本实现:[/color]

实体类:
用户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实例,如有,则更新,如没有,则设置其相关值


/**
* acl实例跟主体和资源关联
* 针对此实例进行授权:某种操作是否允许
* @param permission 只可以取值0,1,2,3
* @param yes true表示允许,false表示不允许
*/
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实例,则说明没有对应的权限


/**
* 获得ACL授权
* @param permission C/R/U/D权限
* @return 授权标识:允许/不允许/不确定
*/
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 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>cwq</short-name>
<uri>http://cwqcwq.iteye.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>


页面使用:


<%@ taglib prefix="mytag" uri="http://cwqcwq.iteye.com/oa/functions" %>
<c:if test="${mytag:hasPermission(username,1,3) }">
<a href="#">删除</a><br>
</c:if>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值