【发布时间】:2019-02-09 17:25:42
【问题描述】:
我有一个用 Grails 3 编写的应用程序,它使用 Spring Security 插件来支持基于会话的身份验证和基本身份验证。我的application.groovy 文件包括以下内容(已清理):
grails.plugin.springsecurity.successHandler.targetUrlParameter = 'r'
grails.plugin.springsecurity.useBasicAuth = true
grails.plugin.springsecurity.useSwitchUserFilter = true
grails.plugin.springsecurity.logout.postOnly = false
grails.plugin.springsecurity.anon.key = '123456789'
grails.plugin.springsecurity.basic.realmName = "My Company, LLC"
grails.plugin.springsecurity.userLookup.usernamePropertyName = 'email'
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.mydomain.user.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.mydomain.user.UserRole'
grails.plugin.springsecurity.authority.className = 'com.mydomain.user.Role'
我们将为发送 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',
]
我在resources.groovy 中明确定义了这些新bean:
beans = {
// ...other bean definitions...
jwtAuthFilter(JwtAuthFilter)
jwtAuthenticationProvider(JwtAuthenticationProvider)
}
但就像我说的那样,虽然这确实有效 - 我的自定义 JwtAuthFilter 类被调用并正确处理传入的 JWT - 基于会话的身份验证已完全停止工作。因此,我尝试注释掉对 jwtAuthFilter 和 jwtAuthenticationProvider 的所有引用,但将 filterNames 和 providerNames 的显式列表保留在 application.groovy 中。不幸的是,这也会导致基于会话的身份验证不起作用。所以它似乎与明确指定过滤器和提供者列表有关。
不幸的是,当我明确列出过滤器时,我无法区分引擎盖下发生的事情与我不明确列出过滤器时的区别。据我所知,它们应该是相同的,但显然它们不是,因为身份验证失败。我怎样才能让它工作?
【问题讨论】:
标签: grails groovy spring-security