Grails Feder Sicherheit / Acegi. Benutzerdefinierte Benutzer + Passwort abgelaufen Management
-
28-09-2019 - |
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?
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']