这是我的问题:当用户使用 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 请求的所有过滤器并创建一个会话。它不对其他请求使用任何过滤器。这是例外行为。
非常感谢您的帮助,我已经为此奋斗了一段时间,任何想法都会受到欢迎!
非常感谢!祝你有美好的一天。