Probieren Sie es aus:
%Vor% Ich schlage vor, dass Sie password_required?
alleine lassen. Das könnte zu Fehlern bei Sicherheit und instabilem Verhalten führen.
Das ist es, für alle Murmeln, wenn ich dieses Problem lösen kann, dann habe ich ein Projekt abgeschlossen.
Wie auch immer, ich benutze Ruby on Rails 3 mit Devise für die Benutzerauthentifizierung. Wie Sie vielleicht wissen, muss ein Benutzer im Benutzer admin / edit standardmäßig sein aktuelles Passwort im Feld current_password eingeben, wenn er ein neues Passwort angibt. Es gibt eine Menge Informationen darüber, wie man current_password deaktivieren kann, so dass Benutzer frei ändern und speichern können.
Ich kann jedoch sehr wenig finden, wenn ich das Gegenteil tue: Ich benötige das aktuelle Passwort für mehr Felder ... in meinem Fall das E-Mail-Feld. UND erfordern nur das aktuelle Passwort, wenn diese E-Mail-Adresse geändert wird, nicht, wenn es gleich bleibt. Derzeit können Benutzer ihre E-Mails frei ändern, ohne ihr aktuelles Passwort zu vergeben, und aus Sicherheitsgründen möchte ich das nicht.
Nachdem ich das Devise-Wiki durchgesehen habe, fand ich diese Seite und ich dachte, ich könnte diesen Code umkehren, um diese Lösung zu vervollständigen. Ich habe es geschafft, in meinem user.rb-Modell (ich habe die unnötige Logik für diesen Beitrag aus dem Weg geräumt) ein wenig herauszuarbeiten ....
%Vor%Es funktioniert "fast". Wenn ich das Benutzerprofil mit Änderungen speichern oder andere Felder ändern, die nicht für das Passwort erforderlich sind (wie der Benutzeravatar), wird das Profil gespeichert und es ist kein Passwort erforderlich. So weit, so gut.
Und wenn ich die E-Mail-Adresse ändere, wird die Validierung ausgelöst .... aber was passiert, ist, dass sowohl das current_password- als auch das Passwort-Feld (für neues Passwort) nach Bedarf ausgelöst werden. Und wenn ich das Passwort in alle drei (Passwort, password_confirmation, current_password) nur zum Teufel ausfülle, wird es nicht dauern, gibt nur einen Validierungsfehler wieder.
Grundsätzlich sollte NUR das current_password erforderlich sein, wenn die E-Mail-Adresse geändert wird. Wie würde ich das in meinem Code machen?
Ich habe meine Log-In-Antwort auf den folgenden Vorschlag von bowsersenior ausgecheckt und sehe die folgenden Zeilen, wenn ich versuche, die E-Mail zu speichern und zu aktualisieren ...
%Vor%Ich frage mich, ob das "ROLLBACK" etwas mit dem letzten Problem zu tun hat?
Probieren Sie es aus:
%Vor% Ich schlage vor, dass Sie password_required?
alleine lassen. Das könnte zu Fehlern bei Sicherheit und instabilem Verhalten führen.
Ich glaube, der Devise-Weg ist wie folgt:
%Vor% Mit anderen Worten, alles geschieht auf Controller-Ebene und wir verwenden entweder User#update_with_password
, wenn der Benutzer möchte seine E-Mail ändern (wir wissen, dass durch den Aufruf needs_password?
in der Update-Aktion) oder User#update_without_password
, wenn Änderungen Benutzer seine anderen Profildaten.
Auch nicht vergessen, müssen Sie „registrieren“, diese neuen RegistrationsController in Ihren Routen:
%Vor%Quelle:
Ähnlich wie Pawels Antwort, aber anstatt das Controller-Methoden-Update zu überschreiben, wie wäre es damit, basierend auf dem devise wiki
%Vor%Tags und Links ruby ruby-on-rails authentication devise