Entwickeln Sie die automatische Abmeldung nach einer Kennwortänderung

76

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.

Anand
quelle
3
"Diese Funktion wurde genau für solche Szenarien hinzugefügt. Ein Administrator kann beim Bearbeiten eines Kennworts sicher sein, dass die Person abgemeldet wird. Sehr nützlich in Situationen, in denen ein Gerät gestohlen wurde und das Ändern Ihres Kennworts auf der Website sicherstellt, dass das Personen, die Ihr Gerät gestohlen haben, können nicht auf die angegebene Website zugreifen. " bit.ly/1qkO7jx
Zajo
bypass_sign_in (@user) für Schienen> 5
vidur punj

Antworten:

130

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.

Bill Eisenhauer
quelle
Danke für die Bestätigung. Ich vermute, dass der Autor inzwischen zu anderen Problemen übergegangen ist. Ich bin froh, dass es für dich funktioniert. Ich schulde ihrem Wiki immer noch eine Seite, um anderen zu helfen.
Bill Eisenhauer
1
Danke, es hat auch bei mir funktioniert, obwohl ich nicht sicher bin, warum Devise den Benutzer überhaupt abmelden würde.
Alex Korban
6
Ein Hinweis für alle zukünftigen Leser: Wenn dies nicht funktioniert und Sie zuerst 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.
Simpleton
1
Wenn Sie current_user.update_with_password(bleh)zurückkehren, falsefehlt Ihnen wahrscheinlich wie ich das aktuelle Kennwort in den Parametern. Überprüfen Sie die Quelle
Nicooga
1
@Questifer: Bei dieser Antwort wurde davon ausgegangen, dass die Implementierung das Kennwort als Singleton-Ressource ansah. Daher ist der Umfang der Aktualisierungsaktion ausschließlich das Kennwort selbst. Obwohl es nie klargestellt wurde und es einige Jahre her ist, seit ich die Antwort vorgeschlagen habe, können Sie sich vorstellen, dass die Anfrage das alte Passwort, das neue Passwort und das Bestätigungspasswort veröffentlicht. Hoffe das hilft.
Bill Eisenhauer
11

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.

Jason H.
quelle
Schließlich! Fand es! Das hat funktioniert! Es stellte sich heraus, dass ich nicht brauchte sign_out current_user, aber brauchte sign_in :user, @user, bypass: true.
Chloe
11

Verwenden Sie diesen Code, um eine Abmeldung zu vermeiden.

sign_in(current_user, :bypass => true)
Ali
quelle
10

Sie können einfach sign_in_after_reset_passwordin Ihrem einstellendevise.rb

config.sign_in_after_reset_password = true
Codebreach
quelle
Tolle Lösung, wissen Sie, warum sie dies standardmäßig deaktivieren? Scheint, als sollte es umgekehrt sein.
Ricks
1
Wie bei den meisten Dingen in solchen Frameworks vermute ich Abwärtskompatibilität.
Codebreach
Ab 2020 ist der Standardwert true, sodass ein Benutzer nach dem Ändern eines Kennworts automatisch angemeldet wird.
Sami Birnbaum
4

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
Ramiz Raja
quelle
2

Aus einigen Gründen current_userist nicht gleich @userobwohl current_user.idgleich @user.id. Also muss ich verwenden sign_in(@user, :bypass => true).

user1227195
quelle
Das ist rätselhaftes Verhalten. Ich habe eine diesbezügliche Frage gestellt, die jedoch gelöscht wurde, da keine Antwort eingegangen ist. Als Referenz dient stackoverflow.com/q/39490056/936494 als Link zu meiner Frage.
Jignesh Gohel
Möglicherweise müssen Sie das Benutzerobjekt neu laden? versuchen Sie anzurufenuser.reload
Ricks
1

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

Hari Shankar
quelle