Frage

Ich arbeite an einem grails Legacy Projekt. Ein Domain-Klasse namens Benutzer existiert. Es enthält das Kennwort, den Benutzernamen, Rollen, etc.

Dieses Projekt verwendet Spring Security für Rollenmanagement. Ich mag Ablauf der Anmeldeinformationen hinzuzufügen (zu zwingen, den Benutzer sein Passwort zu erneuern).

Ich habe die Benutzerklasse geändert. Nicht implementiert die Userdetails Schnittstelle .

Allerdings, wenn ich den Server zu starten, bekomme ich diesen Fehler>

  

org.springframework.beans.factory.BeanCreationException:   Fehler beim Erstellen der Bohne mit dem Namen   ‚Message‘: Initialisierung   bean fehlgeschlagen; verschachtelte Ausnahme ist   org.springframework.beans.factory.BeanCreationException:

     

Fehler beim Erstellen der Bohne mit dem Namen   ‚Transaction‘: kann nicht aufgelöst werden   Bezugnahme auf bean ‚session‘   während Einstellung Bean-Eigenschaft   ‚Session‘; verschachtelte Ausnahme ist   org.springframework.beans.factory.BeanCreationException:

     

Fehler beim Erstellen der Bohne mit dem Namen   'Session': Invocation von init   Verfahren versagt; verschachtelte Ausnahme ist   org.hibernate.PropertyNotFoundException:

     

Es kann keinen Setter für Eigenschaft finden   in Klasse accountNonExpired   com.company.app.user.User

Muss ich einige Bohne registrieren? Ich finde die Fehler ziemlich verwirrend, da die Schnittstelle nicht für eine Setter-Methode nicht fragt.

aktualisieren

Nach weiterer Untersuchung, lief ich in mein SecurityConfig.groovy, dass Aussehen A LOT wie diese ( AcegiSecurity Plugin ):

security {
   // see DefaultSecurityConfig.groovy for all settable/overridable properties

   active = true

   loginUserDomainClass = "User"
   authorityDomainClass = "Role"

 ....
}

Meine Benutzerklasse auch Aussehen A LOT wie folgt aus:

/**
 * User domain class.
 */
class User {
   static transients = ['pass','passwordExpired','credentialsNonExpired']
   static hasMany = [authorities: Role]
   static belongsTo = Role
   /** Username */
   String username
   /** User Real Name*/
   String userRealName
   /** MD5 Password */
   String passwd
   /** enabled */
   boolean enabled

   String email
   boolean emailShow

   /** description */
   String description = ''

   /** plain password to create a MD5 password */
   String pass = '[secret]'

   static constraints = {
      username(blank: false, unique: true)
      userRealName(blank: false)
      passwd(blank: false)
      enabled()
   }

   public boolean isCredentialsNonExpired() {
         return true;
   }
}

habe ich eine Methode zu überprüfen, ob das Passwort sollte für diese Klasse (isCredentialsNonExpired) verfallen oder nicht. Ich brauche diese Methode bei der Anmeldung auszuführen. Im Moment ist es nicht.

So sieht es aus wie es der Acegi Ansatz ist soll ich nehmen. Irgendwelche Gedanken? Es ist mein Verständnis, dass Acegi Spring Security nutzt, nicht wahr?

War es hilfreich?

Lösung

Sind Sie mit der Acegi Plugin, oder es direkt zu konfigurieren? Wenn Sie die Spring Security-Core dieses Plugin wird viel einfacher sein, da es der unterstützten ist out die Box.

Sie wollen wahrscheinlich nicht Ihre Benutzerklasse Ihre UserDetailsService Klasse zu sein, da es oft andere Gepäck wie abgebildet Sammlungen hat, etc. Es kann sicherlich Arbeit, aber eine einfache Datenklasse schaffen, ist ein besserer Ansatz. Es ist bequem org.springframework.security.userdetails.User oder org.springframework.security.core.userdetails.User je nach Version von Spring Security Unterklasse.

Es sieht aus wie Sie gerade einen Getter für accountNonExpired hinzugefügt, aber wenn es geht beibehalten werden, dann muss es einen Setter zu. Wenn Sie den Wert sind abzuleiten und wollen nicht, dass Feld in der Datenbank sein, dann können Sie es auf die Transienten Liste hinzu:

static transients = ['accountNonExpired']
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top