Ich habe eine RoR-Anwendung (Rails 4.2, Ruby 2.2.0) mit Devise. Ich habe es so eingerichtet, dass Admin-Benutzer (identifiziert den booleschen "is_admin", den ich dem Benutzermodell hinzugefügt habe) in der Lage sind, ein neues Benutzerkonto zu erstellen, ihnen ein generiertes Passwort und eine Bestätigungsemail zu geben. Das funktioniert alles einwandfrei. Ich habe auch die Datetime-Spalte pass_changed hinzugefügt, die aktualisiert werden sollte, wenn ein Benutzer sein Passwort ändert, und dann mit created_at überprüft, um sicherzustellen, dass sich das Passwort seit der Erstellung des Accounts geändert hat. Wenn die beiden Daten gleich sind, wird der Benutzer zum Passwortänderungsformular weitergeleitet.Devise mit Ruby on Rails - Erzwinge das Passwort beim ersten Login zu ändern
Ich schrieb ein Verfahren zur Überprüfung, dass der Benutzer sein Passwort geändert hat und platziert es in meinem application_controller.rb:
def check_changed_pass
@user = current_user
if @user.pass_changed == @user.created_at #make sure user has changed their password before accessing internal pages
redirect_to edit_user_registration_path, alert: "You must change your password before logging in for the first time"
end
end
Da ist in meinem internal_controller.rb (für alle internen verwendet, die den Benutzer erfordern zu sein
before_action :check_changed_pass
zum richtigen Zeitpunkt zu aktualisieren pass_changed so weit so gut, aber das Problem kommt mit dem Versuch, ich verschiedene Konfigurationen ausprobiert habe, aber ich kann nicht finden, wo sie diesen Code setzen, damit es löst: angemeldet. Wenn ein Passwort aktualisiert wird, Aber nicht jedes Mal, wenn das Benutzermodell aktualisiert wird, was jedes Ein- und Ausloggen einschließt, wenn ich nur möchte, dass es ausgelöst wird, wenn das Passwort aktualisiert wird.
Wenn ich "before_save: update_pass_change, nur: [: edit,: update]" in meinem Controller plaziere, wird es bei einer Passwortaktualisierung nicht ausgelöst, und wenn ich es in das Benutzermodell platziere, muss ich den Prozedur auch im Modell und dann wird current_user nicht wie im Modell nicht verfügbar aufgenommen. Das Ideal wäre, wenn Devise ähnlich wie der after_database_authentication-Hook einen Haken für after_password_edit hätte. Ich hatte die Devise registrations_controller.rb außer Kraft zu setzen, die Linie
prepend_before_filter :require_no_authentication, only: [ :cancel]
Damit die Admin-Benutzer können neue Benutzer hinzufügen, wäre zu entfernen. Ich habe versucht, update_pass_change dort zu platzieren, aber es scheint nicht vor_save bei einer Passwortänderung auszulösen.
In application_controller.rb
def update_pass_change # records that the user has changed their password
unless current_user.pass_changed != current_user.created_at
current_user.pass_changed = Time.now
end
end
ähnlichen offenen Frage: Ruby on Rails: Devise - password change on first login
ich dies und arbeitet sich nicht tat aktualisieren irgendein Grund. check_password_changed wird ohne Fehler ausgeführt, aktualisiert jedoch pass_changed nicht, obwohl das Kennwort ordnungsgemäß aktualisiert wird. –
@HenryD Überprüfen Sie, ob 'encrypted_password' das korrekte Attribut für das Benutzerpasswort ist. – Doguita
Das war es! Vielen Dank, diese Lösung hat perfekt funktioniert. –