gpt4 book ai didi

grails - 如何在Grails中使用自定义身份验证过滤器?

转载 作者:行者123 更新时间:2023-12-02 15:43:58 25 4
gpt4 key购买 nike

我有一个用Grails 3编写的应用程序,它使用Spring Security插件来支持基于 session 的身份验证和基本身份验证。我的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的身份验证确实可以正常工作。这是个好消息。

但是,一旦我这样做,原始的基于 session 的身份验证 就会停止工作。因此,除了上面 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-基于 session 的身份验证已完全停止工作。因此,我尝试注释掉对jwtAuthFilter和jwtAuthenticationProvider的所有引用,但保留了 filterNames中的 providerNamesapplication.groovy的显式列表。不幸的是,这也导致基于 session 的身份验证不起作用。因此,这似乎与显式指定过滤器和提供程序的列表有关。

不幸的是,当我明确列出过滤器与不过滤器时,我无法说出幕后情况之间的区别。据我所知,它们应该是相同的,但是很明显它们不是相同的,因为身份验证失败。我该如何工作?

最佳答案

要将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

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中使用自定义身份验证过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52170340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com