4

这是我的问题:当用户使用 API(基本上,所有 /myapi/** 请求)时,我不想使用任何 Spring Security 核心过滤器,以避免创建无用的会话。该 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/something 进行任何弹簧安全过滤器,但实际上,它在创建会话时会通过所有过滤器(我在 / 中没有任何用于会话的东西) myapi/东西。

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

因此,对于不匹配早期规则之一的 URL,您需要在末尾添加一个 /** 包罗万象的规则。

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

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

如果我只有在我的 Config.groovy 中,它不会创建会话:

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

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

如果我只有:

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

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

非常感谢您的帮助,我已经为此奋斗了一段时间,任何想法都会受到欢迎!

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

4

1 回答 1

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 版本似乎可以解决这个问题。

于 2012-09-24T15:11:00.203 回答