如何让自定义身份验证过滤器在Grails中工作?

如何让自定义身份验证过滤器在Grails中工作?,grails,groovy,spring-security,Grails,Groovy,Spring Security,我有一个用Grails3编写的应用程序,它使用Spring安全插件支持基于会话和基本身份验证。我的application.groovy文件包括以下内容(已清理): 我们将为发送JWT的外部服务添加集成,因此我编写了一个自定义过滤器和自定义身份验证提供程序,可以处理正在发送的特定JWT声明。我已经完成了一半——我可以将它添加到过滤器链和提供者列表中,基于JWT的身份验证确实有效。这是个好消息 但是,一旦我这样做,原始的基于会话的身份验证就停止工作。因此,除了上面来自application.groo

我有一个用Grails3编写的应用程序,它使用Spring安全插件支持基于会话和基本身份验证。我的
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'
    ]
]