У меня есть приложение, написанное на 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
. К сожалению, это также приводит к тому, что аутентификация на основе сеанса не работает. Так что, похоже, что-то связано с явным указанием списка фильтров и провайдеров.
К сожалению, я не могу сказать разницу между тем, что происходит внутри, когда я явно перечисляю фильтры, и когда я этого не делаю. Насколько я могу судить, они должны быть идентичными, но очевидно, что они не совпадают, поскольку аутентификация не удалась. Как я могу заставить это работать?