如何在Grails中使用自定义身份验证过滤器?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Grails中使用自定义身份验证过滤器?相关的知识,希望对你有一定的参考价值。
我有一个用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
的明确列表。不幸的是,这也导致基于会话的身份验证无法正常工作。因此,它似乎与明确指定过滤器和提供程序列表有关。
不幸的是,当我明确列出过滤器与不使用过滤器时,我无法分辨出底层是什么。据我所知,他们应该是相同的,但显然他们不是因为auth失败了。我怎样才能使这个工作?
要将jwt身份验证添加到已经使用spring安全核心插件的grails应用程序,我建议您使用grails-spring-security-rest插件http://alvarosanchez.github.io/grails-spring-security-rest/latest/docs/但是如果您更喜欢自己的实现,那么插件的配置部分可能会帮助您满足您的需求,它使用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中使用自定义身份验证过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
Grails spring security如何在自定义身份验证中记住我?
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?
Grails:Spring Security Core 自定义身份验证 getUserByUserName 返回 null 对象