2011-02-24 2 views
0

Je travaille sur une application qui stocke le mot de passe comme octet [] dans le db. Je ne peux pas changer le DB. Donc ma classe de domaine a les éléments suivants:Grails printemps-sécurité-core plugin question: mot de passe dans la classe User n'est pas String

String userId 
byte[] userPasswd 

Je sais que je peux personnaliser les noms des propriétés à Config.groovy mais qu'en l'octet [] au lieu de chaîne de type de données de la propriété mot de passe? Dans le cas où ce n'est pas actuellement pris en charge dans le plugin, un travail autour serait très apprécié.

Répondre

1

Il existe plusieurs façons, mais cela semble le plus propre et ne nécessite aucun changement de Config.groovy.

Modifier la propriété persistante de mot de passe à un autre nom comme vous l'avez fait (userPasswd) mais mis dans un getter pour getPassword() que le plugin utilisera, et convertir le tableau d'octets à une chaîne là:

class User { 

    String username 
    byte[] userPasswd 
    boolean enabled 
    boolean accountExpired 
    boolean accountLocked 
    boolean passwordExpired 

    static constraints = { 
     username blank: false, unique: true 
     password blank: false 
    } 

    static transients = ['password'] 

    String getPassword() { 
     userPasswd ? new String(userPasswd) : null 
    } 

    Set<Role> getAuthorities() { 
     UserRole.findAllByUser(this).collect { it.role } as Set 
    } 
} 

L'ajout de 'mot de passe' à la liste des transitoires est important puisque le vrai champ persistant est userPasswd.

Cela affectera la façon dont vous créez des utilisateurs, par ex.

def user = new User(username: 'me', enabled: true, 
    passwd: springSecurityService.encodePassword('password').bytes).save() 
+0

Fait sens. Merci Burt. Appréciez-vous de prendre le temps. – sul

Questions connexes