2015-04-02 3 views
6

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

Antwort

6

Sie einen Rückruf an Ihrem Modell verwenden könnte und prüfen, bevor speichern, wenn die Änderungen Attribut Ihr Passwort enthalten. Etwas wie folgt aus:

class User < ActiveRecord::Base 
    before_save :check_password_changed 

    private 
    def check_password_changed 
    self.pass_changed = Time.now if changed.include? 'encrypted_password' 
    end 
end 
+0

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. –

+1

@HenryD Überprüfen Sie, ob 'encrypted_password' das korrekte Attribut für das Benutzerpasswort ist. – Doguita

+0

Das war es! Vielen Dank, diese Lösung hat perfekt funktioniert. –

0

können Sie auch versuchen, diese

  1. Änderung Datentyp pass_changed zu boolean mit Standardwert false

  2. Dann in Ihrem application_controller.rb

    before_action :check_pass_changed 
    
    private 
    
    def check_pass_changed 
    unless current_user.pass_changed 
        redirect_to custome_password_edit_path, alert: "You must change your password before logging in for the first time" 
    end 
    end 
    
  3. Erstellen Sie dann benutzerdefinierte Aktion in ur users_controller, um das Passwortänderungsformular anzuzeigen und zu aktualisieren. z. Form anzuzeigen: custome_password_edit zu aktualisieren: update_user_password auch vergessen Sie nicht in routes.rb

  4. oben schreiben nach erfolgreicher Änderung des Wertes von pass_changed zu true

Verwandte Themen