2010-03-10 7 views
1

J'utilise le plugin Acegi (AKA Spring Security) dans mon application Grails. Dans SecurityConfig.groovy J'ai ajouté la ligneGrails Acegi: mise à jour nom d'utilisateur

userName = 'email' 

tel que le champ email est utilisé comme nom d'utilisateur. Je trouve que si je change le champ d'email et sauve l'objet, par ex.

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

L'enregistrement se termine sans erreur, mais le champ de courrier électronique n'est pas réellement mis à jour. Ma conjecture est que le plugin Acegi interdit de changer le champ de nom d'utilisateur, mais je serais reconnaissant si quelqu'un pouvait confirmer.

Merci, Don

Répondre

3

L'objet de domaine utilisé par Acegi mises en cache. Comme une coïncidence énorme, j'ai eu le même problème cette semaine et wrote up the solution hier!

En résumé, vous avez deux options:

désactiver le cache de l'objet de domaine en ajoutant cacheUsers = false à votre SecurityConfig.groovy

Actualiser l'objet de domaine en le remplaçant dans le 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 
} 

(Vérifiez la source de GrailsUserImpl pour voir ce que toutes ces vraies valeurs signifient!)

0

Vous pouvez faire simplement:

String oldUsername = user.username 
user.username='[email protected]' 
user.save() 
if(oldUsername != user.username) { 
    SpringSecurityUtils.reauthenticate(user.username, null) 
}