2010-03-10 6 views
1

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

userName = 'email' 

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

user.email = '[email protected]' 
user.save(failOnError: true) 

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

Спасибо, Дон

ответ

3

Объект домен, используемый Acegi кэшируется. В связи с огромным совпадением я столкнулся с той же проблемой на этой неделе и wrote up the solution вчера!

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

Выключить кэширование объекта домена, добавив cacheUsers = ложного вашего 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, чтобы увидеть, что означают все эти истинные ценности!)

0

Вы можете просто выполните:

String oldUsername = user.username 
user.username='[email protected]' 
user.save() 
if(oldUsername != user.username) { 
    SpringSecurityUtils.reauthenticate(user.username, null) 
} 
Смежные вопросы