- 浏览: 151261 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hx0637:
楼主!小弟要面临面试了,能否指导下小弟?
面试 深圳一家公司的 -
kljismi:
你好,我现在正在开这项目的代码,但是我不明白@Privileg ...
权限管理模块分析 -
yzhw:
终于找到了
ImageSizer.java -
sunloveny:
国
struts国际化 -
jackotty:
谢谢楼主的分享
struts validator验证框架
利用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} ); } }
发表评论
-
oa_22
2009-02-04 22:20 1816oa_22: 结合Freemarker,将动态表单显示在公文 ... -
oa_21
2009-02-04 22:18 1221oa_21: 添加动态表单呈现层代码 - 理解批量数据的 ... -
oa_20
2009-02-04 22:15 1293oa_20: 1、创建动态表单的领域模型 FieldInp ... -
oa_18
2009-02-04 22:07 862oa_18: 实现WorkflowManager接口,以及流 ... -
oa_17
2009-02-04 22:03 1229集成JBPM到OA系统,并实现JbpmFacade接口 - ... -
oa_16
2009-02-04 21:58 949oa_16: 根据用例分析的结果,创建WorkflowMan ... -
oa_15:
2009-02-04 21:55 887oa_15: 根据公文流转领域模型创建相关的实体类,并使用x ... -
oa_13
2009-02-04 21:35 1392oa_13: 实现登录功能 - LoginAction ... -
oa_11
2009-02-04 20:51 916初步实现授权管理的界面,重点在于: 1、理解DWR如何使用,理 ... -
oa_10
2009-01-18 12:54 1134提供初始化数据的代码 ... -
oa_09
2009-01-18 12:48 1780提供人员管理、模块管理、角色管理、用户管理相关的代码。 同时 ... -
oa_08
2009-01-18 12:08 1064创建AclManager接口,并实现 - 理解权限管理子系统 ... -
oa_07
2009-01-18 11:54 1290引入Ant和Xdoclet的支持, ... -
oa_06
2009-01-18 11:48 1059利用ThreadLocal实现分页参数的透明传输(通过使用Th ... -
oa_05
2009-01-18 11:41 986从现有的分页处理方案中,抽象出AbstractManager, ... -
oa_04
2009-01-18 11:30 1171利用Pager-Taglib实现机构 ... -
oa_03
2009-01-18 11:22 1190在做完机构管理的业务逻辑之后,下面考虑呈现层的实现。 1、 ... -
oa_02
2009-01-18 11:05 1024整合Spring和Hibernate之后,对于业务逻辑类的测试 ... -
oa_01+
2009-01-18 10:55 1241package com.bjsxt.oa.manager.im ... -
oa_01
2009-01-18 10:48 1280oa_01: 1、建立机构管理的实体类,并映射【重点理解多对 ...
相关推荐
14. **命名规范**:数据库表名、字段名及代码中的所有命名遵循一致的规则,提升代码可读性。 15. **Laravel中间件**:灵活运用Laravel的中间件机制,用于处理权限控制、请求过滤等任务。 16. **访问修饰符**:理解...
《OA_ICESat2_guide.pdf》使用说明详细解读 该文档是关于如何使用开放测高系统(OpenAltimetry)的指南,特别是针对ICESat-2(冰川卫星2号)的数据处理和分析。ICESat-2是美国国家航空航天局(NASA)发射的一颗卫星...
14. **OA_IsVisible**:检查Origin窗口是否可见。 15. **OA_Load**:加载Origin项目或工作簿。 16. **OA_NewEmptyGraph**:创建一个空的Origin图形窗口。 17. **OA_NewWorksheet**:创建新的工作表。 18. **OA_...
蓝凌OA产品V14系统安装维护手册.chm
在实际项目中,OA_14这个压缩包文件可能包含了整个OA系统的源代码,包括SSH框架的配置文件、业务实体类、DAO层、Service层、Controller层以及DWR的配置和接口实现。开发者可以通过分析这些代码,了解如何将权限管理...
14. **性能优化**:OA系统可能涉及缓存策略、数据库查询优化、负载均衡等手段,以提升系统响应速度和并发处理能力。 15. **测试与部署**:包括单元测试、集成测试、性能测试,以及持续集成/持续部署(CI/CD)流程,...
泛微OA 8.0 数据字典,仅供参考 号 表名 中文名称 表类型 说明 1 outerdatawfdetail 输出数据流程详情表 2 outerdatawfperiodset 外部数据触发周期设置表 3 outerdatawfset 外部数据触发设置表 4 ...
- **注意事项**:针对不同版本的Oracle数据库,需要将对应的JDBC驱动(如classes12.jar、ojdbc14.jar或ojdbc5.jar)拷贝到OA的`common/lib`目录下,以确保数据库连接的正常。 - **配置NC**:首先运行`ncdeploy`的`...
14. **日志管理**:如Log4j或SLF4J,记录系统运行时的日志信息,方便问题排查和性能分析。 在"oa_06"这个子文件中,可能包含了JavaOA系统的一个特定模块或者更新版本,具体内容需要实际查看文件才能进一步分析。总...
14. $rs->Open($query, $conn, 1, 1); 15. $i=0; 16. while (!$rs->eof) 17. { ... ``` 这段代码首先引入了必要的库文件,然后连接到Access数据库并执行SQL查询来获取考勤记录。接着,它遍历查询结果,查找匹配的...
14. ORACLE 数据库监听问题 在ORACLE数据库中,监听问题可能会导致数据库的连接问题。解决这个问题可以使用LISTENER.ORA文件,例如: ```bash LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = ...
3. 输出和反馈线路:OA模块输出信号可以选择连接到ADC10的输入A12(OA0)、A13(OA1)和A14(OA2)等,也可以连接到外部引脚。输出还可以连接到内部梯形电阻网络,并通过OAFBRx位选择不同的梯形电阻网络抽头,实现不同的...
14. **版本控制**:如Git,用于源代码的版本管理和团队协作。 通过深入学习和研究这个JAVA办公OA源码,开发者不仅可以掌握Java Web开发的基本技能,还能了解到如何设计和实现一个完整的办公自动化系统,理解企业级...
14. DirAccessControlList和DirAccessPermission:目录访问控制列表和权限,用于设置系统资源的访问控制。 15. Doc相关的表:这些表与文档管理相关,可能包括文档的批准、详情、日志、签章、附件等信息。 16. ...
14、手写签章去“试用”水印 15、手机端【手机签章】的【申请】数量限制 16、天气预报组件天气源用其它替代官方源 17、开启用户【个人名片】中【足迹】的显示 18、开启资源管理【即时通讯监控】(部分) 19、单位...
.NET OA办公管理系统源码是基于C#编程语言开发的一个经典案例,它涵盖了企业日常办公自动化所需的各种功能,为开发者提供了一个全面了解和学习C#在企业级应用开发中的实际运用的平台。以下将详细介绍该系统可能包含...
14. **培训管理**:提供培训信息、效果评估等功能,促进员工成长和发展。 15. **网络会议管理**:支持在线会议申请、管理等,提高远程协作效率。 16. **资源调配管理**:实现资源的有效分配和利用。 17. **组织机构...
14. **性能优化**:包括代码压缩、懒加载、缓存策略、资源预加载等,以提高OA系统的运行效率。 15. **响应式设计**:考虑到不同设备的屏幕尺寸和使用场景,OA系统应具有良好的响应式布局,以适应手机、平板和桌面等...
14. **RESTful API设计**:为了与其他系统交互,JavaOA可能会提供RESTful风格的API,遵循HTTP协议,使用JSON格式传输数据。 15. **性能优化**:通过负载均衡、数据库索引优化、数据缓存等方式提升系统性能,保证在...