`
xxp3369
  • 浏览: 151261 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oa_14

阅读更多


利用JSTL函数实现即时认证
- SecurityFunctions.java
- my.tld
- 注意,因为SecurityFunctions需要用到aclManager,所以,需要注入此对象
- 在InitServlet中,将一些变量CREATE/READ/UPDATE/DELETE放入application scope
  以便于在JSP中使用它来表示操作类型
- 在AclManager中添加
  public boolean hasPermissionByResourceSn(int userId,String reourceSn,int permission);
  接口,以便于在JSP中使用JSTL函数来进行即时认证




package com.bjsxt.oa.web;

import com.bjsxt.oa.manager.AclManager;

/**
 * JSTL函数,主要功能是可以完成权限的即时认证
 * @author Administrator
 *
 */
public class SecurityFunctions {
	
	private static AclManager aclManager;
	
	public static boolean hasPermission(int userId,String resourceSn,int permission){
		
		return aclManager.hasPermissionByResourceSn(userId, resourceSn, permission);
	}

	//这个方法不能定义为static,因为这将导致spring无法注入
	public void setAclManager(AclManager aclManager) {
		SecurityFunctions.aclManager = aclManager;
	}
}



<?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>my</short-name>
  <uri>http://www.bjsxt.com/oa/functions</uri>
  
  <function>
    <name>hasPermission</name>
    <function-class>com.bjsxt.oa.web.SecurityFunctions</function-class>
    <function-signature>boolean hasPermission(int, java.lang.String,int)</function-signature>
  </function>
</taglib>



package com.bjsxt.oa.web;

import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.beanutils.ConvertUtils;

import com.bjsxt.oa.manager.Permission;

public class InitServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		
		//注册日期类型的转换器
		ConvertUtils.register(new UtilDateConverter(), Date.class);

		ServletContext sc = getServletContext();
		sc.setAttribute("CREATE", Permission.CREATE);
		sc.setAttribute("READ", Permission.READ);
		sc.setAttribute("UPDATE", Permission.UPDATE);
		sc.setAttribute("DELETE", Permission.DELETE);
	}

}




package com.bjsxt.oa.manager.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.bjsxt.oa.manager.AclManager;
import com.bjsxt.oa.manager.Permission;
import com.bjsxt.oa.model.ACL;

public class AclManagerImpl extends AbstractManager implements AclManager {

	public void addOrUpdatePermission(String principalType, int principalId,
			int moduleId, int permission, boolean yes) {
		
		//查找ACL对象
		ACL acl = findACL(principalType, principalId, moduleId);
		
		//能够找到ACL对象,更新permission
		if(acl != null){
			acl.setPermission(permission, yes);
			getHibernateTemplate().update(acl);
			return;
		}
		
		//找不到ACL对象,则创建ACL对象,并更新permission
		acl = new ACL();
		acl.setPrincipalType(principalType);
		acl.setPrincipalId(principalId);
		acl.setModuleId(moduleId);
		acl.setPermission(permission, yes);
		getHibernateTemplate().save(acl);
	}

	public void addOrUpdateUserExtends(int userId, int moduleId, boolean yes) {
		ACL acl = findACL(ACL.TYPE_USER,userId,moduleId);
		if(acl != null){
			acl.setExtends(yes);
			getHibernateTemplate().update(acl);
			return;
		}
		acl = new ACL();
		acl.setPrincipalType(ACL.TYPE_USER);
		acl.setPrincipalId(userId);
		acl.setModuleId(moduleId);
		acl.setExtends(yes);
		getHibernateTemplate().save(acl);
	}

	public void delPermission(String principalType, int principalId,
			int moduleId) {
		getHibernateTemplate().delete(findACL(principalType, principalId, moduleId));
	}

	public boolean hasPermission(int userId, int moduleId, int permission) {
		
		//根据用户标识和模块标识查找授权记录
		ACL acl = findACL(ACL.TYPE_USER,userId,moduleId);
		
		//有授权记录
		if(acl != null){
			int yesOrNo = acl.getPermission(permission);
			
			//如果是确定的授权
			if(yesOrNo != ACL.ACL_NEUTRAL){
				
				//立刻返回,无需继续查找
				return yesOrNo == ACL.ACL_YES ? true : false;
			}
		}
		
		//继续查找用户拥有的角色的授权
		
		//查找分配给用户的角色,按优先级从高到低排序
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
				"where u.id = ? order by ur.orderNo";
		List roleIds = getHibernateTemplate().find(hql,userId);
		
		//依次根据角色标识和模块标识查找授权记录
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			acl = findACL(ACL.TYPE_ROLE, rid, moduleId);
			if(acl != null){
				return acl.getPermission(permission) == ACL.ACL_YES ? true : false;
			}
		}
		
		return false;
	}
	
	public boolean hasPermissionByResourceSn(int userId, String resourceSn, int permission) {
		
		String hql = "select m.id from Module m where m.sn = ? ";
		
		return hasPermission(
				userId,
				(Integer)getSession().createQuery(hql).setParameter(0, resourceSn).uniqueResult(),
				permission);
	}	

	public List searchModules(int userId) {
		
		//查找用户拥有的角色,并按优先级从低到高排序
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
			"where u.id = ? order by ur.orderNo desc";
		List roleIds = getHibernateTemplate().find(hql,userId);
		
		Map temp = new HashMap();
		
		//依次查找角色的授权(ACL对象)
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			List acls = findRoleAcls(rid);
			for (Iterator iterator2 = acls.iterator(); iterator2.hasNext();) {
				ACL acl = (ACL) iterator2.next();
				temp.put(acl.getModuleId(), acl);
			}
		}
		
		//针对用户查找有效的用户授权
		List acls = findUserAcls(userId);
		for (Iterator iterator = acls.iterator(); iterator.hasNext();) {
			ACL acl = (ACL) iterator.next();
			temp.put(acl.getModuleId(), acl);
		}
		
		//去除掉那些没有读取权限的授权记录
		Set entries = temp.entrySet();
		for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			ACL acl = (ACL)entry.getValue();
			if(acl.getPermission(Permission.READ) != ACL.ACL_YES){
				iterator.remove();
			}
		}
		
		if(temp.isEmpty()){
			return new ArrayList();
		}
		
		String searchModules = "select m from Module m where m.id in (:ids)";
		
		return getSession()
			.createQuery(searchModules)
			.setParameterList("ids", temp.keySet())
			.list();
		
	}
	
	public List searchAclRecord(String principalType,int principalId){
		String sql = "select moduleId,aclState&1,aclState&2,aclState&4,aclState&8,aclTriState " +
		"from t_acl where principalType = '"+principalType+"' and principalId = "+principalId;
		return getSession().createSQLQuery(sql).list();
	}
	
	/**
	 * 查找授权记录,如果找不到,返回空值
	 * @param principalType
	 * @param principalId
	 * @param moduleId
	 * @return
	 */
	private ACL findACL(String principalType,int principalId,int moduleId){
		return (ACL)getSession().createQuery(
				"select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId=? and acl.moduleId = ?")
				.setParameter(0, principalType)
				.setParameter(1, principalId)
				.setParameter(2, moduleId)
				.uniqueResult();
	}
	
	private List findRoleAcls(int roleId){
		return getHibernateTemplate().find(
				"select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId = ?",
				new Object[]{ACL.TYPE_ROLE,roleId}
			);
	}
	
	private List findUserAcls(int userId){
		return getHibernateTemplate().find(
				"select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId = ? and acl.aclTriState = ? ",
				new Object[]{ACL.TYPE_USER,userId,ACL.ACL_TRI_STATE_UNEXTENDS}
			);		
	}

}
分享到:
评论

相关推荐

    abon_oa_代码需求1

    14. **命名规范**:数据库表名、字段名及代码中的所有命名遵循一致的规则,提升代码可读性。 15. **Laravel中间件**:灵活运用Laravel的中间件机制,用于处理权限控制、请求过滤等任务。 16. **访问修饰符**:理解...

    OA_ICESat2_guide.pdf

    《OA_ICESat2_guide.pdf》使用说明详细解读 该文档是关于如何使用开放测高系统(OpenAltimetry)的指南,特别是针对ICESat-2(冰川卫星2号)的数据处理和分析。ICESat-2是美国国家航空航天局(NASA)发射的一颗卫星...

    Using Origin from LabVIEW.pdf

    14. **OA_IsVisible**:检查Origin窗口是否可见。 15. **OA_Load**:加载Origin项目或工作簿。 16. **OA_NewEmptyGraph**:创建一个空的Origin图形窗口。 17. **OA_NewWorksheet**:创建新的工作表。 18. **OA_...

    蓝凌OA产品V14系统安装维护手册.chm

    蓝凌OA产品V14系统安装维护手册.chm

    oa权限管理(SSH DWR)

    在实际项目中,OA_14这个压缩包文件可能包含了整个OA系统的源代码,包括SSH框架的配置文件、业务实体类、DAO层、Service层、Controller层以及DWR的配置和接口实现。开发者可以通过分析这些代码,了解如何将权限管理...

    oa.zip_PHP OA

    14. **性能优化**:OA系统可能涉及缓存策略、数据库查询优化、负载均衡等手段,以提升系统响应速度和并发处理能力。 15. **测试与部署**:包括单元测试、集成测试、性能测试,以及持续集成/持续部署(CI/CD)流程,...

    泛微OA 8.0 数据字典

    泛微OA 8.0 数据字典,仅供参考 号 表名 中文名称 表类型 说明 1 outerdatawfdetail 输出数据流程详情表 2 outerdatawfperiodset 外部数据触发周期设置表 3 outerdatawfset 外部数据触发设置表 4 ...

    NC-OA协同软件安装

    - **注意事项**:针对不同版本的Oracle数据库,需要将对应的JDBC驱动(如classes12.jar、ojdbc14.jar或ojdbc5.jar)拷贝到OA的`common/lib`目录下,以确保数据库连接的正常。 - **配置NC**:首先运行`ncdeploy`的`...

    javaOA

    14. **日志管理**:如Log4j或SLF4J,记录系统运行时的日志信息,方便问题排查和性能分析。 在"oa_06"这个子文件中,可能包含了JavaOA系统的一个特定模块或者更新版本,具体内容需要实际查看文件才能进一步分析。总...

    通达OA同步中控

    14. $rs-&gt;Open($query, $conn, 1, 1); 15. $i=0; 16. while (!$rs-&gt;eof) 17. { ... ``` 这段代码首先引入了必要的库文件,然后连接到Access数据库并执行SQL查询来获取考勤记录。接着,它遍历查询结果,查找匹配的...

    泛微OA数据库相关问题处理

    14. ORACLE 数据库监听问题 在ORACLE数据库中,监听问题可能会导致数据库的连接问题。解决这个问题可以使用LISTENER.ORA文件,例如: ```bash LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ...

    MSP430中OA运放

    3. 输出和反馈线路:OA模块输出信号可以选择连接到ADC10的输入A12(OA0)、A13(OA1)和A14(OA2)等,也可以连接到外部引脚。输出还可以连接到内部梯形电阻网络,并通过OAFBRx位选择不同的梯形电阻网络抽头,实现不同的...

    JAVA办公OA源码

    14. **版本控制**:如Git,用于源代码的版本管理和团队协作。 通过深入学习和研究这个JAVA办公OA源码,开发者不仅可以掌握Java Web开发的基本技能,还能了解到如何设计和实现一个完整的办公自动化系统,理解企业级...

    泛微OA系统表结构说明文档(20161121135308).pdf

    14. DirAccessControlList和DirAccessPermission:目录访问控制列表和权限,用于设置系统资源的访问控制。 15. Doc相关的表:这些表与文档管理相关,可能包括文档的批准、详情、日志、签章、附件等信息。 16. ...

    通达OA2015破解补丁

    14、手写签章去“试用”水印 15、手机端【手机签章】的【申请】数量限制 16、天气预报组件天气源用其它替代官方源 17、开启用户【个人名片】中【足迹】的显示 18、开启资源管理【即时通讯监控】(部分) 19、单位...

    .net完整版本OA办公管理系统源码(十分经典)

    .NET OA办公管理系统源码是基于C#编程语言开发的一个经典案例,它涵盖了企业日常办公自动化所需的各种功能,为开发者提供了一个全面了解和学习C#在企业级应用开发中的实际运用的平台。以下将详细介绍该系统可能包含...

    oa系统功能介绍及流程图.pdf

    14. **培训管理**:提供培训信息、效果评估等功能,促进员工成长和发展。 15. **网络会议管理**:支持在线会议申请、管理等,提高远程协作效率。 16. **资源调配管理**:实现资源的有效分配和利用。 17. **组织机构...

    面向对象架构OA项目

    14. **性能优化**:包括代码压缩、懒加载、缓存策略、资源预加载等,以提高OA系统的运行效率。 15. **响应式设计**:考虑到不同设备的屏幕尺寸和使用场景,OA系统应具有良好的响应式布局,以适应手机、平板和桌面等...

    javaOA后台部分代码

    14. **RESTful API设计**:为了与其他系统交互,JavaOA可能会提供RESTful风格的API,遵循HTTP协议,使用JSON格式传输数据。 15. **性能优化**:通过负载均衡、数据库索引优化、数据缓存等方式提升系统性能,保证在...

Global site tag (gtag.js) - Google Analytics