如何在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中保留了providerNamesapplication.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 - Acegi:自定义身份验证方法

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?

Grails:Spring Security Core 自定义身份验证 getUserByUserName 返回 null 对象

如何为每个 url 配置 grails/spring 身份验证方案?

如何在 dotnet core 中制作自定义身份验证过滤器,如 Iauthentication