如何让自定义身份验证过滤器在Grails中工作?
我有一个用Grails3编写的应用程序,它使用Spring安全插件支持基于会话和基本身份验证。我的如何让自定义身份验证过滤器在Grails中工作?,grails,groovy,spring-security,Grails,Groovy,Spring Security,我有一个用Grails3编写的应用程序,它使用Spring安全插件支持基于会话和基本身份验证。我的application.groovy文件包括以下内容(已清理): 我们将为发送JWT的外部服务添加集成,因此我编写了一个自定义过滤器和自定义身份验证提供程序,可以处理正在发送的特定JWT声明。我已经完成了一半——我可以将它添加到过滤器链和提供者列表中,基于JWT的身份验证确实有效。这是个好消息 但是,一旦我这样做,原始的基于会话的身份验证就停止工作。因此,除了上面来自application.groo
application.groovy
文件包括以下内容(已清理):
我们将为发送JWT的外部服务添加集成,因此我编写了一个自定义过滤器和自定义身份验证提供程序,可以处理正在发送的特定JWT声明。我已经完成了一半——我可以将它添加到过滤器链和提供者列表中,基于JWT的身份验证确实有效。这是个好消息
但是,一旦我这样做,原始的基于会话的身份验证就停止工作。因此,除了上面来自application.groovy
的部分之外,我还添加了以下内容:
grails.plugin.springsecurity.filterChain.filterNames = [
'securityRequestHolderFilter',
'statelessSecurityContextPersistenceFilter',
'logoutFilter',
'authenticationProcessingFilter',
'basicAuthenticationFilter',
'jwtAuthFilter',
'securityContextHolderAwareRequestFilter',
'rememberMeAuthenticationFilter',
'anonymousAuthenticationFilter',
'exceptionTranslationFilter',
'basicExceptionTranslationFilter',
'filterInvocationInterceptor',
'switchUserProcessingFilter',
]
grails.plugin.springsecurity.providerNames = [
'daoAuthenticationProvider',
'anonymousAuthenticationProvider',
'rememberMeAuthenticationProvider',
'jwtAuthenticationProvider',
]
我在参考资料中明确定义了这些新bean
beans = {
// ...other bean definitions...
jwtAuthFilter(JwtAuthFilter)
jwtAuthenticationProvider(JwtAuthenticationProvider)
}
但是正如我所说的,虽然这确实有效——调用我的自定义JwtAuthFilter类并正确处理传入的JWT——但基于会话的身份验证已经完全停止工作。因此,我尝试注释掉所有对jwtAuthFilter和jwtAuthenticationProvider的引用,但将filterNames
和providerNames
的显式列表保留在application.groovy
中。不幸的是,这也导致基于会话的身份验证无法工作。因此,它似乎与显式指定过滤器和提供者列表有关
不幸的是,当我明确列出过滤器和不列出过滤器时,我无法区分引擎盖下发生了什么。据我所知,它们应该是相同的,但显然它们不是,因为身份验证失败了。我如何才能让它工作?要向已经使用spring security核心插件的grails应用程序添加jwt身份验证,我建议您使用grails spring security rest插件
但是,如果您喜欢自己的实现,那么插件的配置部分可能会帮助您并满足您的需要,它将使用application.groovy中的grails.plugin.springsecurity.filterChain.chainMap
grails.plugin.springsecurity.filterChain.chainMap = [
//Stateless chain
[
pattern: '/**',
filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
],
//Traditional, stateful chain
[
pattern: '/stateful/**',
filters: 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'
]
]
grails.plugin.springsecurity.filterChain.chainMap = [
//Stateless chain
[
pattern: '/**',
filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
],
//Traditional, stateful chain
[
pattern: '/stateful/**',
filters: 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'
]
]