У меня возникла та же проблема, и я нашел обходной путь. LocaleResolver по умолчанию равен SessionLocaleResolver
. Очевидно из названия, он сохраняет язык в сеансе по ключу SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME
.
Таким образом, вы можете установить его вручную после входа пользователя.
Вот мой код от Config.groovy
grails.plugin.springsecurity.useSecurityEventListener = true
grails.plugin.springsecurity.onInteractiveAuthenticationSuccessEvent = { InteractiveAuthenticationSuccessEvent event, appCtx ->
User.withNewSession {
User user = User.get(event.authentication.principal.id)
if (user?.locale) {
HttpServletRequest request = SecurityRequestHolder.request
// SmartConfigLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME if you use locale-configuration plugin
WebUtils.setSessionAttribute(request, SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, user.locale)
}
}
}
Это самый простой способ. Как видите, я использовал закрытие обратного вызова вместо того, чтобы объявлять отдельный класс и регистрировать бин в resources.groovy
.
Также стоит упомянуть, что вы можете сохранить поле Locale
вместо двух отдельных полей для языка и страны.
И эта строка
User user = User.findByUsername(event.authentication.name)
Можно переписать на более эффективный
User user = User.get(event.authentication.principal.id)
он будет использовать кэш второго уровня Hibernate по идентификатору и будет безопасен для чувствительных к регистру имен пользователей.