- 浏览: 82238 次
- 性别:
- 来自: 天津
-
最新评论
-
may小张:
很管用!谢谢分享!
设置JTable的列宽 -
xiangyufangai:
谢谢 非常好
Struts2 Ajax -
lydawen:
lydawen 写道justry 写道这位大哥!
小弟不想使用 ...
Struts2 Ajax -
lydawen:
justry 写道这位大哥!
小弟不想使用 struts2内置 ...
Struts2 Ajax -
zhuzhu1124:
谢谢,学习了
Struts2 Ajax
Acegi默认不支持RBAC权限模型,需要自己扩展。对于数据的获取默认是SQL,也需要扩展。
public class RdbmsEntryHolder implements Serializable{ private static final long serialVersionUID = 2317309106087370323L; //保护的URL模式 private String url; //要求的角色集合 private ConfigAttributeDefinition cad; public String getUrl() { return url; } public ConfigAttributeDefinition getCad() { return cad; } public void setUrl(String url) { this.url = url; } public void setCad(ConfigAttributeDefinition cad) { this.cad = cad; } }
public class RdbmsFilterInvocationDefinitionSource extends JdbcDaoSupport implements FilterInvocationDefinitionSource { protected static final Log logger = LogFactory.getLog(RdbmsFilterInvocationDefinitionSource.class); private SecuredUrlDefinition rdbmsInvocationDefinition; private PathMatcher pathMatcher = new AntPathMatcher(); private Ehcache webresdbCache; private IBaseDAO baseDAO; public ConfigAttributeDefinition getAttributes(Object object) throws IllegalArgumentException { logger.info("starting method getAttributes"); if ((object == null) || !this.supports(object.getClass())) { throw new IllegalArgumentException("抱歉,目标对象不是FilterInvocation类型"); } // 抽取出待请求的URL String url = ((FilterInvocation) object).getRequestUrl(); logger.info("请求的url: "+url); List list = this.getRdbmsEntryHolderList(); if (list == null || list.size() == 0) return null; int firstQuestionMarkIndex = url.indexOf("?"); if (firstQuestionMarkIndex != -1) { url = url.substring(0, firstQuestionMarkIndex); } Iterator iter = list.iterator(); while (iter.hasNext()) { RdbmsEntryHolder entryHolder = (RdbmsEntryHolder) iter.next(); boolean matched = pathMatcher.match(entryHolder.getUrl(), url); if (logger.isDebugEnabled()) { logger.debug("匹配到如下URL: '" + url + ";模式为 " + entryHolder.getUrl() + ";是否被匹配:" + matched); } if (matched) { return entryHolder.getCad(); } } logger.info("ending method getConfigAttributeDefinitions"); return null; } public Iterator getConfigAttributeDefinitions() { logger.info("starting method getConfigAttributeDefinitions"); Set set = new HashSet(); Iterator iter = this.getRdbmsEntryHolderList().iterator(); while (iter.hasNext()) { RdbmsEntryHolder entryHolder = (RdbmsEntryHolder) iter.next(); set.add(entryHolder.getCad()); } return set.iterator(); } public boolean supports(Class clazz) { logger.info("starting method supports"); if (FilterInvocation.class.isAssignableFrom(clazz)) { return true; } else { return false; } } protected void initDao() throws Exception { logger.info("starting method initDao"); this.rdbmsInvocationDefinition = new SecuredUrlDefinition(baseDAO); if(this.webresdbCache == null) throw new IllegalArgumentException("必须为RdbmsFilterInvocationDefinitionSource配置一EhCache缓存"); } private List getRdbmsEntryHolderList(){ logger.info("starting method getRdbmsEntryHolderList"); List list = null; Element element = this.webresdbCache.get("webres"); if(element != null){ list = (List)element.getValue(); } else { list = this.rdbmsInvocationDefinition.execute(); Element elem = new Element("webres", list); this.webresdbCache.put(elem); } logger.info("ending method getRdbmsEntryHolderList.list size :"+list.size()); return list; } public void setWebresdbCache(Ehcache webresdbCache) { this.webresdbCache = webresdbCache; } public void setBaseDAO(IBaseDAO baseDAO) { this.baseDAO = baseDAO; } }
/** * Hibernate实现获取角色,Jdbc实现获取资源. * @author xiongyuan */ public class RdbmsSecuredUrlDefinition extends MappingSqlQuery{ protected static final Log logger = LogFactory.getLog(RdbmsSecuredUrlDefinition.class); private IBaseDAO baseDAO; protected RdbmsSecuredUrlDefinition(DataSource ds,IBaseDAO baseDAO) { super(ds, "SELECT * FROM auth"); logger.info("进入到RdbmsInvocationDefinition构建器中........."); this.baseDAO = baseDAO; compile(); } protected Object mapRow(ResultSet rs, int rownum) throws SQLException { StringBuffer msg = new StringBuffer(); RdbmsEntryHolder rsh = new RdbmsEntryHolder(); //设置URL int urlid = rs.getInt("authid"); String url = rs.getString("authName"); msg.append(url+" 对应的ROLE列表..."); rsh.setUrl(url); ConfigAttributeDefinition cad = new ConfigAttributeDefinition(); /*使用逗号分割role的方案 * String[] tokens = StringUtils.commaDelimitedListToStringArray(rs.getString("rolename").trim()); for(int i = 0; i < tokens.length;++i) cad.addConfigAttribute(new SecurityConfig(tokens[i])); */ //使用自定义表结构后的方案 String hql = "FROM RoleAuth ra where ra.auth.authid=?"; List list = baseDAO.find(hql, urlid); Iterator iterator = list.iterator(); while (iterator.hasNext()) { RoleAuth obj = (RoleAuth)iterator.next(); msg.append(obj.getRole().getRoleName()+","); cad.addConfigAttribute(new SecurityConfig(obj.getRole().getRoleName())); } logger.info(msg); //设置角色集合 rsh.setCad(cad); return rsh; } }
/** * Hibernate实现获取角色权限和资源列表 * @author xiongyuan */ public class SecuredUrlDefinition { private static final Log logger = LogFactory.getLog(SecuredUrlDefinition.class); private IBaseDAO baseDAO; private String loadSecuredUrl = "FROM Auth"; private String loadRoleForUrl = "FROM RoleAuth ra where ra.auth.authid=?"; public SecuredUrlDefinition(IBaseDAO baseDAO) { logger.info("进入到SecuredUrlDefinition构建器中........."); this.baseDAO = baseDAO; } private RdbmsEntryHolder mapRow(Auth auth) throws SQLException { StringBuffer msg = new StringBuffer(); // 设置URL int urlid = auth.getAuthid(); String url = auth.getAuthName(); msg.append(url + " 对应的ROLE列表..."); RdbmsEntryHolder rsh = new RdbmsEntryHolder(); rsh.setUrl(url); ConfigAttributeDefinition cad = new ConfigAttributeDefinition(); // 使用自定义表结构后的方案 List list = baseDAO.find(loadRoleForUrl, urlid); Iterator iterator = list.iterator(); while (iterator.hasNext()) { RoleAuth obj = (RoleAuth) iterator.next(); msg.append(obj.getRole().getRoleName() + ","); cad.addConfigAttribute(new SecurityConfig(obj.getRole().getRoleName())); } logger.info(msg); // 设置角色集合 rsh.setCad(cad); return rsh; } public List execute() { List<RdbmsEntryHolder> entryHolderList = new ArrayList<RdbmsEntryHolder>(); try { List securedUrl = baseDAO.find(loadSecuredUrl); for (int i = 0; i < securedUrl.size(); i++) { Auth auth = (Auth) securedUrl.get(i); entryHolderList.add(mapRow(auth)); } } catch (SQLException e) { e.printStackTrace(); } return entryHolderList; } public void setLoadRoleForUrl(String loadRoleForUrl) { this.loadRoleForUrl = loadRoleForUrl; } public void setLoadSecuredUrl(String loadSecuredUrl) { this.loadSecuredUrl = loadSecuredUrl; } }
发表评论
-
Java enum
2008-12-07 14:18 2892使用enum可以方便的替代常量类。 /**enum可以单独 ... -
Java Reflection
2008-12-07 14:10 935public class Customer impleme ... -
JDK动态代理
2008-12-07 13:45 1194代理模式是给一个对象提供代理,以控制对它的访问,如只有授权用户 ... -
String str = new String("ABC")
2008-12-06 11:58 1283public class Test{ publi ... -
图形验证码
2008-12-05 00:35 999public class AuthImg extends ... -
Spring的Servlet启动监听器
2008-12-05 00:33 3668public class StartupListener ex ... -
MD5加密
2008-12-05 00:28 949public class SecurityByMD5 ... -
制作启动界面
2008-12-05 00:17 976以前写的坦克大战的启动代码。 public class S ... -
设置JTable的列宽
2008-12-05 00:08 10491public class JTableUtil { ... -
自己设计的JdbcTemplate
2008-12-04 23:59 2906自己写的Jdbc模板,使用了Template,Strategy ... -
XML解析之Digester
2008-12-04 23:26 1688Digester package lets you confi ... -
构建CVS项目到Version One
2008-11-30 23:57 1020以前用CVS的时候,一个新的项目需要频繁修改,还有很多文件、包 ... -
XML解析之DOM4j
2008-11-30 23:19 779Dom4j is an easy to use, open s ... -
XML解析之SAX
2008-11-27 00:48 1093SAX是一个用于处理XML事 ... -
XML解析之DOM
2008-11-27 00:36 855Sun公司提供了Java API for XML Parsin ... -
关于Java栈与堆的深入思考
2008-07-02 20:54 7691. 栈(stack)与堆(heap)都是 ... -
JDK环境变量配置
2008-04-28 15:21 1524Windows 1.增加系统变量JAVA_HOME = C:\ ...
相关推荐
### 基于Acegi安全框架的权限管理研究与实现 #### 摘要与背景 在当前的软件开发领域,尤其是针对Java Web应用程序的安全性设计尤为重要。一个完整的Java Web应用系统不仅需要强大的功能模块来支撑业务逻辑,还需要...
总之,AceGI作为一个强大的安全框架,通过灵活的配置和扩展机制,使开发者能轻松地在Web应用中实现复杂的安全控制。它不仅支持基本的认证和授权,还允许自定义逻辑以适应各种业务场景。通过理解和熟练运用AceGI,...
6. **事件监听**:Acegi允许监听和处理安全相关的事件,如登录成功、失败,或者权限被拒绝等,开发者可以自定义处理这些事件的行为。 在实际应用中,我们通常会遵循以下步骤来使用Acegi: 1. **集成Acegi**:将...
Acegi Security是Spring框架早期的一个安全模块,它提供了全面的基于Spring的应用程序的访问控制和身份验证功能。在本文中,我们将深入探讨如何使用Acegi Security来实现用户权限的控制。 Acegi Security的核心功能...
在Spring_Acegi框架鉴权的实现中,我们主要关注的是如何处理用户的登录验证以及在验证成功或失败后系统如何响应。 首先,Spring_Acegi通过实现Servlet的`Filter`接口来介入HTTP请求的生命周期。`...
本文将深入探讨基于RBAC(Role-Based Access Control)模式的Acegi权限管理,它是在Spring框架上的一个经典实现。RBAC是一种广泛采用的权限模型,通过角色来分配权限,有效地实现了用户与权限之间的间接关联,降低了...
通过这个示例,开发者可以学习到如何使用Acegi Security进行权限配置,包括设置安全性拦截器、创建自定义的认证和授权机制、处理未授权或未认证的异常、以及如何在控制器中检查用户权限等。此外,还能了解到如何在...
Acegi Security是Spring框架的一个扩展,它为Java应用程序提供了强大的安全性和权限控制功能。在这个手册中,读者将深入理解如何利用Acegi来构建安全、灵活且可扩展的企业级应用程序。 1. **Acegi Security概述**:...
在处理复杂的权限管理时,Acegi允许开发者将资源权限数据存储到数据库,而不是仅局限于配置文件中,这样可以实现更灵活的权限动态扩展。 在传统的Acegi配置中,资源和角色的关系通常是硬编码在XML配置文件内的,...
Acegi框架的集成和使用,不仅保持了Spring框架的轻量级和简洁性,而且通过高效的AOP和IoC机制,使得安全控制功能得以在不影响应用其他部分的前提下,灵活地扩展和维护。 在面对日益复杂的网络安全挑战时,利用Acegi...
博文链接中提到的“https://huangshenji.iteye.com/blog/298413”可以查看具体的实现细节,可能包括如何配置Acegi,如何在MyBatis中查询权限数据,以及如何自定义权限策略等。 6. **升级至Spring Security**: ...
4. **实现认证和授权逻辑**:根据应用需求,实现自定义的认证和授权类,这些类通常会扩展Acegi提供的基础类。 5. **测试和调试**:在实际运行环境中测试安全功能,确保用户权限设置正确,并使用Acegi提供的日志和...
4. **commons-collections-3.1.jar**: Apache Commons Collections是Java集合框架的一个扩展库,提供了丰富的集合操作和实用工具,例如列表转换、排序、查找等,这对于处理Acegi Security中的用户和权限数据非常有用...
总的来说,这个"最简单acegi权限管理实例"是一个很好的学习起点,通过实践可以了解Acegi的基本用法,包括用户认证、权限控制、配置文件的理解以及如何与Spring框架集成。在实际项目中,我们需要根据需求进行更复杂的...
6. **定制编辑器配置**:`customEditorConfigurer.jpg`可能涉及到Acegi中自定义类型转换器的配置,这对于处理自定义权限对象或其他特殊类型的认证信息很有帮助。 7. **用户权限管理**:标签中的“用户权限”表明,...
Acegi Security是一个专门为Spring框架设计的权限控制框架,旨在为基于J2EE的企业级应用程序提供全面的安全服务。这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境...
这个例子是为初学者设计的,旨在帮助他们快速理解和应用Acegi框架。Acegi(现在已被Spring Security替代)在Spring应用程序中提供了身份验证、授权和会话管理等功能。 在Spring Acegi的例子中,我们首先需要了解的...
Acegi Security是Spring框架早期的一个安全模块,后来发展成为Spring Security,是Java Web应用程序中广泛使用的安全框架。本文将深入探讨如何将Acegi(或现在的Spring Security)集成到基于Spring的Web应用程序中,...