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

时间:2018-09-04 16:12:49

标签: grails groovy spring-security

我有一个用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的所有引用,但将filterNamesproviderNamesapplication.groovy的显式列表保留在适当的位置。不幸的是,这也导致基于会话的身份验证不起作用。因此,这似乎与显式指定过滤器和提供程序的列表有关。

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

1 个答案:

答案 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