【问题标题】:How can I get a custom authentication filter working in Grails?如何在 Grails 中使用自定义身份验证过滤器?
【发布时间】:2019-02-09 17:25:42
【问题描述】:

我有一个用 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 的所有引用,但将 filterNamesproviderNames 的显式列表保留在 application.groovy 中。不幸的是,这也会导致基于会话的身份验证不起作用。所以它似乎与明确指定过滤器和提供者列表有关。

不幸的是,当我明确列出过滤器时,我无法区分引擎盖下发生的事情与我不明确列出过滤器时的区别。据我所知,它们应该是相同的,但显然它们不是,因为身份验证失败。我怎样才能让它工作?

【问题讨论】:

    标签: grails groovy spring-security


    【解决方案1】:

    为已经使用spring security core插件的grails应用添加jwt认证,建议使用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'
        ]
    ]
    

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2014-03-03
      • 2016-12-11
      • 2020-02-14
      • 2021-04-18
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多