Wenn ich in Devise das Kennwort des Benutzers ändere und es in der Datenbank aktualisiert wird, meldet die Site den Benutzer sofort ab. Ich will dieses Verhalten nicht - wie mache ich das? Bitte helfen Sie.
Wenn ich in Devise das Kennwort des Benutzers ändere und es in der Datenbank aktualisiert wird, meldet die Site den Benutzer sofort ab. Ich will dieses Verhalten nicht - wie mache ich das? Bitte helfen Sie.
Antworten:
Ich hatte das gleiche Problem und der folgende Code scheint für mich zu funktionieren.
Angenommen, der Kennwortcontroller ist für eine Singleton-Route festgelegt. Angenommen, das authentifizierte Modell ist ein Konto. Damit haben Sie folgendes:
def update
if current_account.update_with_password(params[:account])
sign_in(current_account, :bypass => true)
flash[:notice] = 'Password updated.'
redirect_to account_path
else
render :action => :show
end
end
Der Hauptbestandteil ist der Methodenaufruf sign_in, mit dem versucht wird, das Konto erneut anzumelden, die Rückrufe des Direktors jedoch umgangen und das Konto in der Sitzung gespeichert werden.
sign_outüber dem hinzufügen müssen sign_in, erfassen Sie zuerst das Modell in einer Instanzvariablen, damit Sie es über die sign_inMethode übergeben können, andernfalls übergeben Sie es nil.
Das obige Beispiel hat bei der Verwendung mehrerer Bereiche in Devise nicht funktioniert.
Ich musste den Bereichs- / Ressourcennamen in den Pfad sign_in einfügen, damit er funktioniert, und um Chaos zu vermeiden, musste ich auch den alten Benutzer abmelden, sonst würde jede Art von Verwirrung im Überfluss vorhanden sein.
Die Änderungen, die ich vornehmen musste, würden anhand des obigen Beispiels ungefähr so aussehen.
def update
if current_account.update_with_password(params[:account])
sign_out(current_account)
sign_in(:account, current_account, :bypass => true)
flash[:notice] = 'Password updated.'
redirect_to account_path
else
render :action => :show
end
end
Bearbeiten, um hinzuzufügen: Ich glaube, ich musste den Benutzer zwangsweise abmelden, weil ich irgendwo den Code von Devise überschrieben habe, damit sich Benutzer bei bestimmten Aktionen nicht abmelden. Im Nachhinein; keine gute Idee! Dieser Ansatz ist viel besser! Es ist sicherer, eigene Controller zu erstellen, als den Code von Devise zu überschreiben, es sei denn, dies ist absolut unvermeidbar.
sign_out current_user, aber brauchte sign_in :user, @user, bypass: true.
Sie können einfach sign_in_after_reset_passwordin Ihrem einstellendevise.rb
config.sign_in_after_reset_password = true
Update zu Bill Eisenhauer Antwort oben-
sign_in(current_account, :bypass => true)wurde bypass_sign_in current_accountstattdessen veraltet verwendet
Weitere Details finden Sie hier http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#bypass_sign_in-instance_method
Fügen Sie Ihrer Methode, mit der Sie das Kennwort des Benutzers aktualisieren, unmittelbar nach dem Aktualisieren des Kennworts des Benutzers in der Datenbank den folgenden Code hinzu:
def update
. . . . .<your code>
. . . . .<your code>
sign_in(@user, :bypass => true)
. . . . .<your code>
. . . . .<your code>
end
Aus einigen Gründen current_userist nicht gleich @userobwohl current_user.idgleich @user.id. Also muss ich verwenden sign_in(@user, :bypass => true).
user.reload
Bitte beziehen Sie sich hier auf diese Antwort. Ich habe alle oben genannten Antworten ausprobiert. Es funktioniert nicht, wenn der Bereich nicht hinzugefügt wird. https://stackoverflow.com/a/30418266/4973585
Das funktioniert nicht -
sign_in @user, bypass: true
Das funktioniert -
sign_in :user, @user, bypass: true
Verwenden Sie das registrierbare Modul, mit dem Sie Benutzerfunktionen sowohl registrieren als auch bearbeiten können
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password