我有一个用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
的显式列表保留在适当的位置。不幸的是,这也导致基于会话的身份验证不起作用。因此,这似乎与显式指定过滤器和提供程序的列表有关。
不幸的是,当我明确列出过滤器与不过滤器时,我无法说出幕后情况的不同。据我所知,它们应该是相同的,但是很明显它们不是相同的,因为身份验证失败。我该如何工作?
答案 0 :(得分:0)
要将jwt身份验证添加到已经使用spring安全核心插件的grails应用程序中,建议您使用grails-spring-security-rest插件http://alvarosanchez.github.io/grails-spring-security-rest/latest/docs/ 但是,如果您更喜欢自己的实现,则插件的config部分可以帮助并满足您的需求,它可以使用 application.groovy 中的 grails.plugin.springsecurity.filterChain.chainMap
cider-rename