Acegi中的FilterInvocationDefinitionMap提供两种实现:PATTERN_TYPE_ANT_PATH及PATTERN_TYPE_PERL5。其中PATTERN_TYPE_ANT_PATH使用apache Ant的路径格式来进行url的模式匹配,由于只有**, *, ?少数几个通配符,所以使用起来比较简单,但是无法支持带参数的url,如/action.do?method=m这种url,在进行匹配之前,会先将?后面的部分截去。见PathBasedFilterInvocationDefinitionMap.java的代码:
java 代码
- public ConfigAttributeDefinition lookupAttributes(String url) {
-
- int firstQuestionMarkIndex = url.indexOf("?");
-
- if (firstQuestionMarkIndex != -1) {
- url = url.substring(0, firstQuestionMarkIndex);
- }
-
- if (isConvertUrlToLowercaseBeforeComparison()) {
- url = url.toLowerCase();
-
- if (logger.isDebugEnabled()) {
- logger.debug("Converted URL to lowercase, from: '" + url + "'; to: '" + url + "'");
- }
- }
-
- Iterator iter = requestMap.iterator();
-
- while (iter.hasNext()) {
- EntryHolder entryHolder = (EntryHolder) iter.next();
-
- boolean matched = pathMatcher.match(entryHolder.getAntPath(), url);
-
- if (logger.isDebugEnabled()) {
- logger.debug("Candidate is: '" + url + "'; pattern is " + entryHolder.getAntPath() + "; matched="
- + matched);
- }
-
- if (matched) {
- return entryHolder.getConfigAttributeDefinition();
- }
- }
-
- return null;
- }
在对Acegi的缺省实现不进行扩展的情况下,要实现对带参数URL的安全控制,可以使用PATTERN_TYPE_PERL5即正则表达式进行模式匹配(在RegExpBasedFilterInvocationDefinitionMap中实现),例如上述的路径可以用如下的模式来进行匹配:^/user\.do\?method=.*,采用这种方案的优点是可以利用正则表达式的强大表达能力,缺点是难以实现模式的自动生成。在一个实用的基于角色的权限管理体系中,通常对要进行安全控制的资源是由管理员通过管理界面来定制的,如果使用PATTERN_TYPE_PERL5的格式来制定模式,则需要管理员熟练掌握正则表达式的使用,有难度。考虑实现一个UrlFilterInvocationDefinitionMap,仅提供一种通配符*,又支持url参数,简单又实用。代码如下:
java 代码
- import org.acegisecurity.ConfigAttributeDefinition;
- import org.acegisecurity.intercept.web.AbstractFilterInvocationDefinitionSource;
- import org.acegisecurity.intercept.web.FilterInvocationDefinition;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
- import java.util.*;
-
-
-
-
-
-
- public class UrlFilterInvocationDefinitionMap extends AbstractFilterInvocationDefinitionSource
- implements FilterInvocationDefinition {
-
- private static final Log logger = LogFactory.getLog(UrlFilterInvocationDefinitionMap.class);
-
- private List<EntryHolder> requestMap = new ArrayList<EntryHolder>();
- private boolean convertUrlToLowercaseBeforeComparison = false;
-
- public ConfigAttributeDefinition lookupAttributes(String url) {
- Iterator iter = requestMap.iterator();
-
- if (isConvertUrlToLowercaseBeforeComparison()) {
- url = url.toLowerCase();
-
- if (logger.isDebugEnabled()) {
- logger.debug("Converted URL to lowercase, from: '" + url + "'; to: '" + url + "'");
- }
- }
-
- while (iter.hasNext()) {
- EntryHolder entryHolder = (EntryHolder) iter.next();
-
- boolean matched = UrlMatcher.matches(url, entryHolder.getUrlPattern());
-
- if (logger.isDebugEnabled()) {
- logger.debug("Candidate is: '" + url + "'; pattern is " + entryHolder.getUrlPattern()
- + "; matched=" + matched);
- }
-
- if (matched) {
- return entryHolder.getConfigAttributeDefinition();
- }
- }
-
- return null;
- }
-
- public Iterator getConfigAttributeDefinitions() {
- Set<ConfigAttributeDefinition> set = new HashSet<ConfigAttributeDefinition>();
- for (EntryHolder aRequestMap : requestMap) {
- set.add(aRequestMap.getConfigAttributeDefinition());
- }
- return set.iterator();
- }
-
- public void addSecureUrl(String urlPattern, ConfigAttributeDefinition attr) {
- requestMap.add(new EntryHolder(urlPattern, attr));
-
- if (logger.isDebugEnabled()) {
- logger.debug("Added url pattern: " + urlPattern + "; attributes: " + attr);
- }
- }
-
- public boolean isConvertUrlToLowercaseBeforeComparison() {
- return this.convertUrlToLowercaseBeforeComparison;
- }
-
- public void setConvertUrlToLowercaseBeforeComparison(boolean convertUrlToLowercaseBeforeComparison) {
- this.convertUrlToLowercaseBeforeComparison = convertUrlToLowercaseBeforeComparison;
- }
-
- protected class EntryHolder {
- private ConfigAttributeDefinition configAttributeDefinition;
- private String urlPattern;
-
- public EntryHolder(String urlPattern, ConfigAttributeDefinition attr) {
- this.urlPattern = urlPattern;
- this.configAttributeDefinition = attr;
- }
-
- protected EntryHolder() {
- throw new IllegalArgumentException("Cannot use default constructor");
- }
-
- public String getUrlPattern() {
- return urlPattern;
- }
-
- public ConfigAttributeDefinition getConfigAttributeDefinition() {
- return configAttributeDefinition;
- }
- }
-
- }
其中模式匹配用了一个UrlMatcher类,代码及test列在下面:
java 代码
- import java.util.regex.Pattern;
- import java.util.regex.Matcher;
-
-
-
-
-
-
- public class UrlMatcher {
- public static boolean matches(String url, String urlPattern){
- StringBuffer buff = new StringBuffer();
- buff.append('^');
- buff.append(urlPattern.replaceAll("\\.", "\\\\.").replaceAll("\\?", "\\\\?").replaceAll("\\*", ".*"));
- buff.append("$");
- Pattern pattern = Pattern.compile(buff.toString());
- Matcher matcher = pattern.matcher(url);
- boolean found = matcher.find();
- return found && matcher.group().equals(url);
- }
- }
java 代码
-
-
-
-
-
-
- import junit.framework.*;
- import com.vnv.basicacegi.security.UrlMatcher;
-
- public class UrlMatcherTest extends TestCase {
-
- public void testMatches() throws Exception {
- assertTrue(UrlMatcher.matches("/user.do?method=home", "/user.do?method=*"));
- assertTrue(UrlMatcher.matches("/user/home/abc/action.do", "/user/*/action.do"));
- assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d", "/user/*/action.do*"));
- assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d", "/user/*/action.do?*"));
- assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d", "/user/*/action.do?method=*"));
- assertFalse(UrlMatcher.matches("/user/action.do?method=a&c=d", "/user/*/action.do?method=*"));
- assertTrue(UrlMatcher.matches("/action.do?method=a&c=d", "*/action.do?method=*"));
- }
- }
这下可以爽了。
分享到:
相关推荐
Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...
Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web... 在Acegi安全系统中,需要被认证的用户,系统或代理称为"Principal"。Acegi安全系统和其他的安全系统不同,它并没有角色和用户组的概念。
总的来说,Acegi Security(Spring Security)是Spring生态中的重要组成部分,它提供了一种高效且灵活的方式来管理和保护应用程序的安全,确保用户访问控制的准确性和严密性,从而保障系统的稳定运行。通过深入理解...
**局限性**: - **依赖Spring框架**:Acegi基于Spring构建,这意味着应用必须先支持Spring框架才能使用Acegi。 - **学习曲线**:对于初次接触的开发者而言,Acegi的复杂性和灵活性可能会带来较高的学习成本。 ####...
在《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf》中,可能会详细讲解如何配置和使用Acegi。以下是一些关键步骤: 1. **添加依赖**:首先,在项目中引入Acegi的依赖库,通常是通过Maven或...
Acegi是Spring Security的前身,它是一个用于Java企业级应用的安全框架,提供了全面的...通过学习和实践提供的示例代码以及参考学习网址,你可以深入了解Acegi的功能,并将其应用到自己的项目中,确保应用的安全性。
这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境下轻松迁移。Acegi Security的核心设计考虑了认证(Authentication)和授权(Authorization)这两个关键的安全...
在本文中,我们将深入探讨Spring Acegi的核心概念、功能和使用方法。 首先,Acegi的主要目标是保护Spring应用免受非法访问,它提供了丰富的功能来实现用户认证、会话管理、权限控制以及安全相关的异常处理。Acegi的...
3. **频道安全**:Acegi提供了一套频道安全机制,可以确保敏感数据在网络传输过程中的安全性。例如,它可以强制某些请求必须通过HTTPS来防止数据被窃听。 4. **会话管理**:框架可以检测和防御会话劫持、会话固定等...
在`YourUserDetailsService`中,你需要实现`UserDetailsService`接口,提供一个方法`loadUserByUsername(String username)`,该方法会由Acegi在认证过程中调用,用于查找指定用户名的用户信息。 最后,为了使Basic...
Spring Security是在Acegi的基础上进行了重大改进和扩展,兼容性更好,功能更强大,且与Spring框架的集成更加紧密。尽管如此,了解Acegi Security对于理解Spring Security的原理和机制仍然非常有帮助。 在实际的...
Acegi安全框架简介及实用扩展,spring acegi 权限管理
Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...
而在acegi安全框架(现已被Spring Security替代)中,ehCache被用来增强安全性相关的性能,例如缓存用户权限信息,减少数据库查询频率。 acegi是Spring的一个安全模块,主要用于处理应用程序的认证和授权。通过集成...
将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.
Spring Acegi是一个安全框架,它为Spring应用提供了全面的安全管理功能。...通过学习和实践这个demo,开发者可以深入理解Spring安全框架的核心概念,并能够将其应用到自己的项目中,增强应用的安全性。
Spring Acegi权限控制是Spring框架中用于实现Web应用安全的一种解决方案。Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两...
将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.