Spring安全核心和filterChain chainMap问题

时间:2012-08-21 08:33:16

标签: grails filter spring-security

这是我的问题:当用户使用API​​(基本上是所有/ myapi / **请求)时,我不想使用任何spring安全核心过滤器,以避免创建无用的会话。 api基于oauth令牌。

所以,我使用插件spring-security-core进行用户身份验证,我在Config.groovy文件中添加了

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-securityContextHolderAwareRequestFilter,-rememberMeAuthenticationFilter,-anonymousAuthenticationFilter,-exceptionTranslationFilter',
'/**':'JOINED_FILTERS'
]

基本上,从我的理解,它不应该通过任何弹簧安全过滤器为所有/ myapi /东西,但实际上,它通过所有过滤器,因为它创建一个会话(我没有任何东西为会话/ myapi / something。

但是,根据http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

  

因此,对于与之前规则之一不匹配的网址,您需要一个/ ** catch-all规则。

这就是为什么我不明白为什么请求仍然遍及任何/ myapi /的所有过滤器。

我做了一些测试,这可能有所帮助:

如果我只在Config.groovy中创建一个会话:

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-securityContextHolderAwareRequestFilter,-rememberMeAuthenticationFilter,-anonymousAuthenticationFilter,-exceptionTranslationFilter'
]

但它也没有为其他网址创建会话,没有使用任何其他过滤器,这导致应用程序无法正常工作。这个例子只是为了确保会话不是由/ myapi / something请求创建的

如果我有:

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS'
]

然后,它遍历所有/ myapi / something请求的所有过滤器并创建会话。它不会对其他请求使用任何过滤器。这是例外行为。

非常感谢你的帮助,我现在已经和它斗争了一段时间了,任何想法都会受到欢迎!

非常感谢!祝你有个美好的一天。

1 个答案:

答案 0 :(得分:4)

是的,我遇到了同样的问题!虽然我不使用JOINED_FILTER,但我明确地设置过滤器:

grails.plugins.springsecurity.filterChain.chainMap = [
    '/apitest/**': 'requestContextAttributesFilter,sessionPreventionFilter,objectRepositoryCreationFilter',
    '/api/**':     'requestContextAttributesFilter,sessionPreventionFilter,objectRepositoryCreationFilter,apiAuthenticationFilter',
    '/**':         'requestContextAttributesFilter,securityContextPersistenceFilter,aisAuthenticationProcessingFilter'
]

当我访问'/ apitest / *'URL时,会执行catch-all规则的最后一个过滤器。当我创建一个带有一些虚拟过滤器的简单Grails项目时,我无法重现这个问题,这些过滤器只有一个println和一个类似的链图。对于简单的测试项目,过滤器按预期运行。由于在执行哪个过滤器时没有正确的日志记录以及原因,因此很难确定问题所在。很奇怪......

<强>更新

我能够使用Spring Security Core插件版本1.2.7.2重现此错误。但是,这个错误似乎在版本1.2.7.3中得到修复!

请参阅:http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10229&version=13100

使用版本1.2.7.3似乎可以解决这个问题。