系统权限解决方案

#

每个软件中都有权限这个功能,搞了个通过tag实现的方法,复用性很强,今天把标签功能给改了,可以支持多个code,具体实现如下:

#

psy-operation.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.blog.com.cn/http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blog.com.cn/http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="http://www.blog.com.cn/2.0">
<description>
psychcn 标记库 1.0
</description>
<tlib-version>1.0</tlib-version>
<short-name>psydict</short-name>
<uri>http://www.psychcn.com/taglibs</uri>
<tag>
<name>op</name>
<description>权限标签</description>
<tag-class>com.psychcn.web.tags.OperationTag</tag-class>
<body-content>scriptless</body-content>

<attribute>
<name>code</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>opset</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>[align=left][/align]

OperationTag.java

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import java.io.IOException;
import java.util.*;

public class OperationTag extends SimpleTagSupport {
private Set operation_set;
private String default_operation_set_name = "ops";
private String code;

public void setCode(String code) {
this.code = code;
}
public void setOpset(Set operation_set) {
this.operation_set = operation_set;
}
public void setOpsetName(String name) {
this.default_operation_set_name= name;
}

public void doTag() throws JspException, IOException{
//session中没有设置权限HashSet,给默认值
if (operation_set==null) {
Object o = this.getJspContext().findAttribute(default_operation_set_name);
if (o instanceof Set)
operation_set = (Set)o;
}

if (code == null || operation_set == null)
throw new JspException("标签属性无效,无法执行!");

//这里支持多个code,用','分割,有一个符合条件就输出,全部不满足则不输出(注意不能有空格,区分大小写)
String[] codes = code.split(",");
for (String s : codes) {
if (operation_set.contains(s)) {
this.getJspBody().invoke(this.getJspContext().getOut());
return;
}
}
}
}

OperationService.java

public java.util.HashSet<String> findByUserId(String userId) throws Exception;
实现接口类:(//通过USERID找到对应的operation的code)

OperationServiceImpImp.java

public java.util.HashSet<String> findByUserId(String userId) throws Exception{
Session s = getSession();
Transaction tx = s.beginTransaction();

String sql = "select DISTINCT o.code from users u " +
"inner join groupmember gm on u.userId=gm.user_Id " +
"inner join groupacl ga on gm.group_id=ga.group_id " +
"inner join operation o on ga.op_id = o.id " +
"where u.userId=?";
Query q = s.createSQLQuery(sql).setString(0,userId);
List<Object> ls = q.list();
HashSet ops = new HashSet();
for(Object object : ls){
ops.add(object);
}
tx.commit();
releaseSession(s);

return ops;
}

这样,在用户登录时,可以把该用户的权限HashSet装载到Session中



//把当前用户的权限添加到HashSet
HashSet ops = AppResource.operationService.findByUserId(user.getUserId());
session.setAttribute("ops",ops);

最后,在JSP中就可以简单的使用标签来判断有没有某个权限,没有则不显示

<%@ taglib prefix="psy" uri="http://www.psychcn.com/taglibs" %>
<psy:op code="Finance_Payment">看你有没有权限让我显示</psy:op>

OK!可以根据需要修改。
OA权限管理分为: 人员管理 角色管理 模块管理 其实有这样一些概念: 主体:用户和角色可以称为主体。 资源:就是可以进行crud的对象。 权限:就是对资源的crud操作。 授权:就是对这种权限的分配。 认证:就是查询用户是否有权限。 用户和角色的关系是多对多,这共同组成了主体。 模块是资源。 主体和资源的纽带是ACL(访问控制列表),主体和ACL之间是多对多关系,资源和ACL之间也是多对多关系。ACL里面就记录了用户的权限。 在数据库上它就是一个中间表的作用。 授权是这样的: 授权分为两种: 角色授权 对角色统一授权,继承这种角色的用户就自动拥有该角色所拥有的权限,并且权限分有优先级,这样两种权限如果之间发生冲突则取高优级。 用户授权 对用户进行单独授权,这种情况必须在不继承角色的情况下才能生效,并且此时只使用单独授权的权限。 每一次授权都是针对特定模块,而不是所有。 搜索用户所有授权过程是这样的: 1、查询用户所有角色的权限,按优先给从低到高,有重复的可以以高优先级覆盖。(存入Map中,key是资源标识) 2、查询用户直接授予的权限。查询不继承的权限。 3、合并权限。 4、再从中选择具体的权限(crud)。 认证过程是这样的: 根据用户标识和资源标识查找ACL实例 有实例: 查看是否有确定授权 确定:返回授权 不确定(继承):查询用户拥有角色列表,根据角色标识和资源标识查找ACL实例(循环) 没有实例: 查询用户拥有角色列表,根据角色标识和资源标识查找ACL实例(循环)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值