Grails Acegi: обновить имя пользователя - PullRequest
1 голос
/ 10 марта 2010

Я использую плагин Acegi (AKA Spring Security) в своем приложении Grails. В SecurityConfig.groovy я добавил строку

userName = 'email'

такой, что поле электронной почты используется в качестве имени пользователя. Я обнаружил, что если я изменю поле электронной почты и сохраню объект, например,

user.email = 'my_new_email@foo.com'
user.save(failOnError: true)  

Сохранение завершается без ошибок, но поле электронной почты фактически не обновляется. Я предполагаю, что плагин Acegi запрещает изменять поле имени пользователя, но я был бы признателен, если кто-то может подтвердить.

Спасибо, Дон

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Объект домена, используемый acegi, кэшируется. По стечению обстоятельств у меня была такая же проблема на этой неделе, и вчера написал решение !

В итоге у вас есть два варианта:

Отключите кэширование объекта домена, добавив cacheUsers = false в ваш SecurityConfig.groovy

Обновите объект домена, заменив его в SecurityContextHolder

private def refreshUserPrincipal(user) {
    GrantedAuthority[] auths = user.authorities.collect {
        new GrantedAuthorityImpl(it.authority)
    }
    def grailsUser = new GrailsUserImpl(
        user.username
            "",
            true,
            true,
            true,
            true,
            auths,
            user);
    def authToken = new UsernamePasswordAuthenticationToken(grailsUser, "", auths)
    SecurityContextHolder.context.authentication = authToken
}

(Проверьте источник GrailsUserImpl , чтобы увидеть, что означают все эти истинные значения!)

1 голос
/ 27 июня 2012

Вы можете просто сделать:

String oldUsername = user.username
user.username='my@newusername.com'
user.save()
if(oldUsername != user.username) {
  SpringSecurityUtils.reauthenticate(user.username, null)
}
...