Как я могу получить пользовательский фильтр аутентификации, работающий в Grails? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть приложение, написанное на 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:

beans = {
    // ...other bean definitions...
    jwtAuthFilter(JwtAuthFilter)
    jwtAuthenticationProvider(JwtAuthenticationProvider)
}

Но, как я уже сказал, хотя это работает - мой пользовательский класс JwtAuthFilter вызывается и корректно обрабатывает входящие JWT - аутентификация на основе сеанса перестала работать полностью. Поэтому я попытался закомментировать все ссылки на jwtAuthFilter и jwtAuthenticationProvider, но оставил явный список filterNames и providerNames в application.groovy. К сожалению, это также приводит к тому, что аутентификация на основе сеанса не работает. Так что, похоже, что-то связано с явным указанием списка фильтров и провайдеров.

К сожалению, я не могу сказать разницу между тем, что происходит внутри, когда я явно перечисляю фильтры, и когда я этого не делаю. Насколько я могу судить, они должны быть идентичными, но очевидно, что они не совпадают, поскольку аутентификация не удалась. Как я могу заставить это работать?

1 Ответ

0 голосов
/ 05 сентября 2018

Чтобы добавить аутентификацию jwt в приложение grails, которое уже использует плагин ядра безопасности Spring, я предлагаю вам использовать плагин grails-spring-security-rest http://alvarosanchez.github.io/grails-spring-security-rest/latest/docs/ Но если вы предпочитаете собственную реализацию, возможно, раздел конфигурации плагина помогает и соответствует вашим потребностям, он использует grails.plugin.springsecurity.filterChain.chainMap в application.groovy

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'
    ]
]
...