`
iMzw
  • 浏览: 193977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

acegi动态资源配置的另一种实现

    博客分类:
  • Java
阅读更多
相关文章
http://www.iteye.com/article/17538
http://www.iteye.com/topic/18635

下面为org.acegisecurity.intercept.web。FilterSecurityInterceptor 的源码摘录

/**
 * Performs security handling of HTTP resources via a filter implementation.<p>The
 * <code>ObjectDefinitionSource</code> required by this security interceptor is of type {@link
 * FilterInvocationDefinitionSource}.</p>
 *  <P>Refer to {@link AbstractSecurityInterceptor} for details on the workflow.</p>
 *
 * @author Ben Alex
 * @version $Id: FilterSecurityInterceptor.java 1496 2006-05-23 13:38:33Z benalex $
 */
public class FilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
    //~ Static fields/initializers =====================================================================================

    private static final String FILTER_APPLIED = "__acegi_filterSecurityInterceptor_filterApplied";

    //~ Instance fields ================================================================================================

   private FilterInvocationDefinitionSource objectDefinitionSource;
   。。。省略部分内容
    public void setObjectDefinitionSource(FilterInvocationDefinitionSource newSource) {
        this.objectDefinitionSource = newSource;
    }

    public void setObserveOncePerRequest(boolean observeOncePerRequest) {
        this.observeOncePerRequest = observeOncePerRequest;
    }
}

通常的配置为:
<bean id="filterSecurityInterceptor"
		class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
	<property name="authenticationManager"
		ref="authenticationManager">
	</property>
	<property name="accessDecisionManager"
			ref="httpRequestAccesssDecisionManager">
	</property>
	<property name="objectDefinitionSource">
		<value>
                PATTERN_TYPE_APACHE_ANT
			/admin/securedpage.jsp=ROLE_ADMIN
			/admin/securedpage.jsp=ROLE_UNIT
                </value>
	</property>
</bean>

我们可以看出,其实我们只需要提供一个FilterInvocationDefinitionSource接口的实现,就可以完成从数据库读取资源配置的工作。
以下为我写的一个实现(参考了阿飞的书《敏捷Acegi,Cas》),没有使用缓存,实际的环境中应该缓存数据,避免每次查询数据库。
数据库关系图:见附件

关键类
package net.imzw.acegi;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.acegisecurity.ConfigAttributeDefinition;
import org.acegisecurity.intercept.web.FilterInvocation;
import org.acegisecurity.intercept.web.FilterInvocationDefinitionSource;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

public class RdbmsFilterInvocationDefinitionSource extends JdbcDaoSupport
		implements FilterInvocationDefinitionSource {

	private RdbmsFilterInvocationDefinition rdbmsFilterInvocationDefinition;

	private PathMatcher pathMatcher = new AntPathMatcher();

	public ConfigAttributeDefinition getAttributes(Object object)
			throws IllegalArgumentException {
		if ((object == null) || !this.supports(object.getClass())) {
			throw new IllegalArgumentException(
					"Object must be a FilterInvocation");
		}

		String url = ((FilterInvocation) object).getRequestUrl();
	
		return this.lookupAttributes(url);
	}

	@Override
	protected void initDao() throws Exception {
		this.rdbmsFilterInvocationDefinition = new RdbmsFilterInvocationDefinition(
				this.getDataSource());
	}

	public ConfigAttributeDefinition lookupAttributes(String url) {
		if(logger.isDebugEnabled()){
			logger.debug("lookup Attributes for "+url);
		}
		List<RdbmsEntryHolder> hodlers = getRdbmsEntryHolderList();
		if (hodlers == null || hodlers.size() == 0) {
			return null;
		}
		int firstQuestionMarkIndex = url.indexOf("?");

		if (firstQuestionMarkIndex != -1) {
			url = url.substring(0, firstQuestionMarkIndex);
		}

		Iterator<RdbmsEntryHolder> ite = hodlers.iterator();
		while (ite.hasNext()) {
			RdbmsEntryHolder holder = ite.next();
			boolean matched = pathMatcher.match(holder.getUrl(), url);
			if (matched) {
				return holder.getConfigAttributeDefinition();
			}
		}
		return null;
	}

	public boolean supports(Class clazz) {
		return FilterInvocation.class.isAssignableFrom(clazz);
	}

	public Iterator getConfigAttributeDefinitions() {
		Set<ConfigAttributeDefinition> cads=new HashSet<ConfigAttributeDefinition>();
		List<RdbmsEntryHolder> hodlers = getRdbmsEntryHolderList();
		Iterator<RdbmsEntryHolder> ite = hodlers.iterator();
		while (ite.hasNext()) {
			 cads.add(ite.next().getConfigAttributeDefinition());
		}
		return cads.iterator();
	}

	public RdbmsFilterInvocationDefinition getRdbmsFilterInvocationDefinition() {
		return rdbmsFilterInvocationDefinition;
	}

	public void setRdbmsFilterInvocationDefinition(
			RdbmsFilterInvocationDefinition rdbmsFilterInvocationDefinition) {
		this.rdbmsFilterInvocationDefinition = rdbmsFilterInvocationDefinition;
	}

	private List<RdbmsEntryHolder> getRdbmsEntryHolderList() {
		List<RdbmsEntryHolder> list = getRdbmsFilterInvocationDefinition()
				.execute();
		if(logger.isDebugEnabled()){
			for(RdbmsEntryHolder h:list){
				logger.debug(h);
			}
		}
		return list;
	}
}


配置如下:
<bean id="filterSecurityInterceptor"
		class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
		<property name="authenticationManager"
			ref="authenticationManager">
		</property>
		<property name="accessDecisionManager"
			ref="httpRequestAccesssDecisionManager">
		</property>
		<property name="objectDefinitionSource">
			<ref local="rdbmsFilterInvocationDefinitionSource" />
		</property>
	</bean>
<bean id="rdbmsFilterInvocationDefinitionSource"
		class="net.imzw.acegi.RdbmsFilterInvocationDefinitionSource">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>

由于项目的工期很紧(国内好像没有那个项目工期不紧的),没有时间将我的思路组织成文章,详细的见附件,不难理解。
注:示例需要jdk1.6,可以自己稍稍改一下就应该可以在jdk1.5下运行。
  • 大小: 20 KB
分享到:
评论
3 楼 iMzw 2007-06-19  
Feiing 写道
呵呵, 楼主莫非没看到我另一篇帖子 ?

http://www.iteye.com/topic/18635

两年前的东西, 也要挖出来,  大可不必


不好意思,我确实没有看到,见笑!
因为最近使用到了Acegi所以就顺道发了出来,如果早看到的话,就不用浪费我半天时间研究Acegi的源码了。谢谢提醒。
关于缓存,我一直用的是Spring-Modules提供的声明式缓存。
另外,不知兄台对Acegi+Spring+dwr的组合有没有接触过?能不能提一些关于权限管理好的建议?

2 楼 iMzw 2007-06-19  
1 楼 Feiing 2007-06-19  
呵呵, 楼主莫非没看到我另一篇帖子 ?

http://www.iteye.com/topic/18635

两年前的东西, 也要挖出来,  大可不必

相关推荐

    acegi的详细配置实现

    ### Acegi的详细配置实现 #### 一、整体架构概览 **Acegi Security** 是一个为Spring框架设计的安全管理工具,它提供了丰富的安全服务,包括认证(Authentication)、授权(Authorization)以及会话管理(Session ...

    实战Acegi

    Acegi提供了一种声明式的方式来定义安全策略,这意味着你可以通过配置XML或注解来控制谁可以访问哪些资源,而不是在代码中硬编码这些规则。这使得安全策略的维护和更新变得灵活且易于管理。 身份验证是Acegi的基础...

    Spring安全系统:Acegi Security--星月夜

    标题和描述均提及了“Spring安全系统:Acegi Security”,这是一种专为Spring Framework设计的安全解决方案,旨在提供强大的认证和授权功能。Acegi Security,后更名为Spring Security,是Spring生态系统中的重要...

    acegi rememberMe和匿名登录

    另一方面,匿名登录是一种让用户在不提供完整认证信息的情况下访问部分资源的方法。Acegi Security通过创建一个特殊的“匿名用户”角色来实现这一功能。当用户访问受保护的资源时,如果他们没有提供有效的身份验证...

    acegi-security-1.0.7-osgi.jar.zip

    另一方面,"acegi-security--license.txt"文件是关于Acegi Security的许可协议,通常会包含Apache License 2.0或其他开源许可,这决定了如何使用、修改和分发这个软件。阅读并理解许可证内容非常重要,因为这关系到...

    acegi-security-jboss-1.0.7.jar.zip

    另一方面,"acegi-security--license.txt"文件通常包含了软件的许可证信息,详细规定了软件的使用、分发和修改条件。对于开源软件如Acegi Security,了解其许可证条款非常重要,因为这决定了你在项目中如何合法地...

    Acegi 各过滤的解析(二)

    总的来说,Acegi 的过滤器机制提供了一种灵活且强大的方式来保护你的应用。通过理解和配置这些过滤器,你可以确保只有授权的用户能访问敏感资源,同时还能处理各种安全场景,如会话超时、并发登录限制以及不同通道的...

    acegi-security-jetty-ext-0.6.1.jar.zip

    在Java应用中,`.jar`文件是一种标准的归档格式,用于打包类文件和其他资源,使得它们可以在Java虚拟机(JVM)上运行。在这个压缩包中,"acegi-security-jetty-ext-0.6.1.jar"就是这个扩展的主程序包,包含了所有...

    sping 框架 最新破解

    AOP(Aspect Oriented Programming)则是另一种编程范式,它关注系统的横切关注点,如日志记录、事务管理和安全性等。AOP将这些关注点与核心业务逻辑分离,通过切面(Aspect)来实现,使得代码更易于维护和扩展。在...

    Spring Live

    最后,考虑到2007年的日期,这份资源可能还讨论了Spring与早期的Java EE技术(如EJB)的对比,强调Spring的轻量级特性以及它如何提供一种更灵活、更易测试的替代方案。 综上所述,【Spring Live】很可能是一份全面...

    Struts 数据库项目开发宝典 13

    接着,JSF是一种用于构建用户界面的Java标准,它提供了丰富的组件库和事件模型,使得开发者可以快速创建动态的Web页面。JSF与Struts结合使用,可以增强用户界面的交互性和用户体验,同时利用Struts的强项处理后端...

    DWR中文文档.pdf

    Struts是另一个广泛使用的Java MVC框架。DWR可以与Struts集成,提供更强大的客户端-服务器通信能力。 **4.5 DWR与Weblogic或PageFlow** 对于使用Weblogic服务器或其他类似技术的应用程序,DWR同样可以很好地集成。...

    spring security3.0 spring权限问题

    负责决定是否以另一个身份运行。 - **5.4.2.3 AfterInvocationManager** 处理方法调用后的事件。 - **5.4.2.4 扩展安全对象模型** 可以扩展 AbstractSecurityInterceptor 以满足特定的需求。 **6. 支持的...

    J2EE 就业秘笈J2EE面试

    JSF是Java EE中的另一种UI组件模型,关注点包括: - UI组件、事件处理、转换和验证 - Managed Beans和Facelets模板 - JSF 2.x的新特性 **8. EJB(Enterprise JavaBeans)** EJB提供企业级服务,如事务、安全和状态...

    spring security3 中文版本

    - **内存认证**:提供了一种简单的内存认证方式,适用于测试环境或小型应用。 - **JdbcDaoImpl**:通过 JDBC 访问数据库来实现认证功能。 - **权限分组**:支持基于角色的访问控制。 #### 四、技术概述 - **...

    jsecurity 资料

    首先,JSecurity提供了一种声明式的安全模型,允许开发者通过配置或注解来定义访问控制规则,降低了安全逻辑的复杂度。例如,你可以通过简单的XML配置或者Java代码来定义哪些用户、角色或权限可以访问特定的资源。 ...

Global site tag (gtag.js) - Google Analytics