`
半人马
  • 浏览: 22976 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Acegi中的FilterInvocationDefinitionMap的局限性及小改进

阅读更多
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 代码
 
  1. public ConfigAttributeDefinition lookupAttributes(String url) {  
  2.     // Strip anything after a question mark symbol, as per SEC-161. See also SEC-321  
  3.     int firstQuestionMarkIndex = url.indexOf("?");  
  4.   
  5.     if (firstQuestionMarkIndex != -1) {  
  6.         url = url.substring(0, firstQuestionMarkIndex);  
  7.     }  
  8.   
  9.     if (isConvertUrlToLowercaseBeforeComparison()) {  
  10.         url = url.toLowerCase();  
  11.   
  12.         if (logger.isDebugEnabled()) {  
  13.             logger.debug("Converted URL to lowercase, from: '" + url + "'; to: '" + url + "'");  
  14.         }  
  15.     }  
  16.   
  17.     Iterator iter = requestMap.iterator();  
  18.   
  19.     while (iter.hasNext()) {  
  20.         EntryHolder entryHolder = (EntryHolder) iter.next();  
  21.   
  22.         boolean matched = pathMatcher.match(entryHolder.getAntPath(), url);  
  23.   
  24.         if (logger.isDebugEnabled()) {  
  25.             logger.debug("Candidate is: '" + url + "'; pattern is " + entryHolder.getAntPath() + "; matched="  
  26.                 + matched);  
  27.         }  
  28.   
  29.         if (matched) {  
  30.             return entryHolder.getConfigAttributeDefinition();  
  31.         }  
  32.     }  
  33.   
  34.     return null;  
  35. }  
在对Acegi的缺省实现不进行扩展的情况下,要实现对带参数URL的安全控制,可以使用PATTERN_TYPE_PERL5即正则表达式进行模式匹配(在RegExpBasedFilterInvocationDefinitionMap中实现),例如上述的路径可以用如下的模式来进行匹配:^/user\.do\?method=.*,采用这种方案的优点是可以利用正则表达式的强大表达能力,缺点是难以实现模式的自动生成。在一个实用的基于角色的权限管理体系中,通常对要进行安全控制的资源是由管理员通过管理界面来定制的,如果使用PATTERN_TYPE_PERL5的格式来制定模式,则需要管理员熟练掌握正则表达式的使用,有难度。考虑实现一个UrlFilterInvocationDefinitionMap,仅提供一种通配符*,又支持url参数,简单又实用。代码如下:
java 代码
 
  1. import org.acegisecurity.ConfigAttributeDefinition;  
  2. import org.acegisecurity.intercept.web.AbstractFilterInvocationDefinitionSource;  
  3. import org.acegisecurity.intercept.web.FilterInvocationDefinition;  
  4. import org.apache.commons.logging.Log;  
  5. import org.apache.commons.logging.LogFactory;  
  6.   
  7. import java.util.*;  
  8.   
  9. /** 
  10.  * User: user 
  11.  * Date: 2007-4-11 
  12.  * Time: 9:14:00 
  13.  */  
  14. public class UrlFilterInvocationDefinitionMap extends AbstractFilterInvocationDefinitionSource  
  15.     implements FilterInvocationDefinition {  
  16.   
  17.     private static final Log logger = LogFactory.getLog(UrlFilterInvocationDefinitionMap.class);  
  18.   
  19.     private List<EntryHolder> requestMap = new ArrayList<EntryHolder>();  
  20.     private boolean convertUrlToLowercaseBeforeComparison = false;  
  21.   
  22.     public ConfigAttributeDefinition lookupAttributes(String url) {  
  23.         Iterator iter = requestMap.iterator();  
  24.   
  25.         if (isConvertUrlToLowercaseBeforeComparison()) {  
  26.             url = url.toLowerCase();  
  27.   
  28.             if (logger.isDebugEnabled()) {  
  29.                 logger.debug("Converted URL to lowercase, from: '" + url + "'; to: '" + url + "'");  
  30.             }  
  31.         }  
  32.   
  33.         while (iter.hasNext()) {  
  34.             EntryHolder entryHolder = (EntryHolder) iter.next();  
  35.   
  36.             boolean matched = UrlMatcher.matches(url, entryHolder.getUrlPattern());  
  37.   
  38.             if (logger.isDebugEnabled()) {  
  39.                 logger.debug("Candidate is: '" + url + "'; pattern is " + entryHolder.getUrlPattern()  
  40.                     + "; matched=" + matched);  
  41.             }  
  42.   
  43.             if (matched) {  
  44.                 return entryHolder.getConfigAttributeDefinition();  
  45.             }  
  46.         }  
  47.   
  48.         return null;  
  49.     }  
  50.   
  51.     public Iterator getConfigAttributeDefinitions() {  
  52.         Set<ConfigAttributeDefinition> set = new HashSet<ConfigAttributeDefinition>();  
  53.         for (EntryHolder aRequestMap : requestMap) {  
  54.             set.add(aRequestMap.getConfigAttributeDefinition());  
  55.         }  
  56.         return set.iterator();  
  57.     }  
  58.   
  59.     public void addSecureUrl(String urlPattern, ConfigAttributeDefinition attr) {  
  60.         requestMap.add(new EntryHolder(urlPattern, attr));  
  61.   
  62.         if (logger.isDebugEnabled()) {  
  63.             logger.debug("Added url pattern: " + urlPattern + "; attributes: " + attr);  
  64.         }  
  65.     }  
  66.   
  67.     public boolean isConvertUrlToLowercaseBeforeComparison() {  
  68.         return this.convertUrlToLowercaseBeforeComparison;    
  69.     }  
  70.   
  71.     public void setConvertUrlToLowercaseBeforeComparison(boolean convertUrlToLowercaseBeforeComparison) {  
  72.         this.convertUrlToLowercaseBeforeComparison = convertUrlToLowercaseBeforeComparison;  
  73.     }  
  74.   
  75.     protected class EntryHolder {  
  76.         private ConfigAttributeDefinition configAttributeDefinition;  
  77.         private String urlPattern;  
  78.   
  79.         public EntryHolder(String urlPattern, ConfigAttributeDefinition attr) {  
  80.             this.urlPattern = urlPattern;  
  81.             this.configAttributeDefinition = attr;  
  82.         }  
  83.   
  84.         protected EntryHolder() {  
  85.             throw new IllegalArgumentException("Cannot use default constructor");  
  86.         }  
  87.   
  88.         public String getUrlPattern() {  
  89.             return urlPattern;  
  90.         }  
  91.   
  92.         public ConfigAttributeDefinition getConfigAttributeDefinition() {  
  93.             return configAttributeDefinition;  
  94.         }  
  95.     }  
  96.   
  97. }  
其中模式匹配用了一个UrlMatcher类,代码及test列在下面:
java 代码
 
  1. import java.util.regex.Pattern;  
  2. import java.util.regex.Matcher;  
  3.   
  4. /** 
  5.  * User: user 
  6.  * Date: 2007-4-11 
  7.  * Time: 9:48:09 
  8.  */  
  9. public class UrlMatcher {  
  10.     public static boolean matches(String url, String urlPattern){  
  11.         StringBuffer buff = new StringBuffer();  
  12.         buff.append('^');  
  13.         buff.append(urlPattern.replaceAll("\\.""\\\\.").replaceAll("\\?""\\\\?").replaceAll("\\*"".*"));  
  14.         buff.append("$");  
  15.         Pattern pattern = Pattern.compile(buff.toString());  
  16.         Matcher matcher = pattern.matcher(url);  
  17.         boolean found = matcher.find();  
  18.         return found && matcher.group().equals(url);  
  19.     }  
  20. }  

java 代码
 
  1. /** 
  2.  * User: user 
  3.  * Date: 2007-4-11 
  4.  * Time: 10:07:07 
  5.  */  
  6.   
  7. import junit.framework.*;  
  8. import com.vnv.basicacegi.security.UrlMatcher;  
  9.   
  10. public class UrlMatcherTest extends TestCase {  
  11.   
  12.     public void testMatches() throws Exception {  
  13.         assertTrue(UrlMatcher.matches("/user.do?method=home""/user.do?method=*"));  
  14.         assertTrue(UrlMatcher.matches("/user/home/abc/action.do""/user/*/action.do"));  
  15.         assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d""/user/*/action.do*"));  
  16.         assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d""/user/*/action.do?*"));  
  17.         assertTrue(UrlMatcher.matches("/user/home/abc/action.do?method=a&c=d""/user/*/action.do?method=*"));  
  18.         assertFalse(UrlMatcher.matches("/user/action.do?method=a&c=d""/user/*/action.do?method=*"));  
  19.         assertTrue(UrlMatcher.matches("/action.do?method=a&c=d""*/action.do?method=*"));  
  20.     }  
  21. }
这下可以爽了。
分享到:
评论

相关推荐

    acegi

    Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...

    acegi使用说明acegi原理及如何与spring、hibernate结合

    Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web... 在Acegi安全系统中,需要被认证的用户,系统或代理称为"Principal"。Acegi安全系统和其他的安全系统不同,它并没有角色和用户组的概念。

    Acegi框架介绍 acegi安全与认证

    总的来说,Acegi Security(Spring Security)是Spring生态中的重要组成部分,它提供了一种高效且灵活的方式来管理和保护应用程序的安全,确保用户访问控制的准确性和严密性,从而保障系统的稳定运行。通过深入理解...

    Acegi使用.pdf

    **局限性**: - **依赖Spring框架**:Acegi基于Spring构建,这意味着应用必须先支持Spring框架才能使用Acegi。 - **学习曲线**:对于初次接触的开发者而言,Acegi的复杂性和灵活性可能会带来较高的学习成本。 ####...

    基于java的ACEGI

    在《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf》中,可能会详细讲解如何配置和使用Acegi。以下是一些关键步骤: 1. **添加依赖**:首先,在项目中引入Acegi的依赖库,通常是通过Maven或...

    Acegi例子代码+一个很好的学习Acegi的网址

    Acegi是Spring Security的前身,它是一个用于Java企业级应用的安全框架,提供了全面的...通过学习和实践提供的示例代码以及参考学习网址,你可以深入了解Acegi的功能,并将其应用到自己的项目中,确保应用的安全性。

    ACEGI

    这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境下轻松迁移。Acegi Security的核心设计考虑了认证(Authentication)和授权(Authorization)这两个关键的安全...

    spring acegi 详细文档

    在本文中,我们将深入探讨Spring Acegi的核心概念、功能和使用方法。 首先,Acegi的主要目标是保护Spring应用免受非法访问,它提供了丰富的功能来实现用户认证、会话管理、权限控制以及安全相关的异常处理。Acegi的...

    acegi basic认证具体demo

    在`YourUserDetailsService`中,你需要实现`UserDetailsService`接口,提供一个方法`loadUserByUsername(String username)`,该方法会由Acegi在认证过程中调用,用于查找指定用户名的用户信息。 最后,为了使Basic...

    Acegi中文参考手册

    3. **频道安全**:Acegi提供了一套频道安全机制,可以确保敏感数据在网络传输过程中的安全性。例如,它可以强制某些请求必须通过HTTPS来防止数据被窃听。 4. **会话管理**:框架可以检测和防御会话劫持、会话固定等...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应

    Spring Security是在Acegi的基础上进行了重大改进和扩展,兼容性更好,功能更强大,且与Spring框架的集成更加紧密。尽管如此,了解Acegi Security对于理解Spring Security的原理和机制仍然非常有帮助。 在实际的...

    ehCache在acegi中的应用

    而在acegi安全框架(现已被Spring Security替代)中,ehCache被用来增强安全性相关的性能,例如缓存用户权限信息,减少数据库查询频率。 acegi是Spring的一个安全模块,主要用于处理应用程序的认证和授权。通过集成...

    Acegi安全框架简介及实用扩展

    Acegi安全框架简介及实用扩展,spring acegi 权限管理

    acegi+cas整合工程及说明1

    将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.

    spring acegi 使用工程demo

    Spring Acegi是一个安全框架,它为Spring应用提供了全面的安全管理功能。...通过学习和实践这个demo,开发者可以深入理解Spring安全框架的核心概念,并能够将其应用到自己的项目中,增强应用的安全性。

    acegi+cas整合工程及说明3

    将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.

    Acegi学习笔记(JAVA系统安全编程时用到)

    在本文中,我们将深入探讨 Acegi 的基本概念、如何设置以及它如何与 Spring 框架集成。 首先,让我们了解 Acegi 的核心功能。Acegi 提供了一套全面的安全机制,包括但不限于: 1. 认证(Authentication):确认...

Global site tag (gtag.js) - Google Analytics