In den letzten 2 Stunden habe ich versucht, ein seltsames Problem in der Entwicklung zu beheben, bei dem ich mich nicht anmelden kann.
Hier ist das Zeug, auf das ich mich auch beziehe:
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
Fügen Sie auch den Screenshot hinzu:
Hinweis: Ich habe den Debugger in devise aktiviert, sodass der obige Code ein interner Code ist.
Für mich sieht es nach einem Problem aus Devise.secure_compare
.
password.encoding
uns das Ergebnis mitteilen? Dies ist das einzige, was ich mir vorstellen kann, dort falsch zu laufen. Sie können auch damit herumspielen::BCrypt::Engine.hash_secret(password, salt)
und dies mit dem tatsächlich gespeicherten Hash vergleichen. Für diesen Vergleichtext.bytes
könnte sich auch dies als nützlich erweisen.password.bytes
und'vinodsobale'.bytes
nur um sicher zu gehen?password
? Wenn dies derNULL character \0
Fall ist, sollte es in Unicode codiert sein undpassword == 'vinodsobale'
nicht zurückkehrentrue
.Antworten:
Dieses Problem ist auf einen bekannten Fehler bei der Beschädigung von Zeichenfolgen in Ruby 2.2.0 zurückzuführen, der in 2.2.2 behoben wurde.
Wie im Fehlerbericht beschrieben, trat die Beschädigung auf, als BCrypt eine bestimmte API zur Zeichenfolgenerstellung aus seiner C-Erweiterung aufrief, die Devise v3.3.0 durch Aufrufen
::BCrypt::Engine.hash_secret
von derDevise::Models::DatabaseAuthenticatable#valid_password?
Methode auslöste . Eine gerätespezifische Problemumgehung für diesen Fehler wurde in Version 3.5.0 veröffentlicht.Die Lösung ist entweder:
< 2.2.0
oder auf upgraden>= 2.2.2
;>= 3.5.0
.quelle
Wie wäre es mit
resource.valid_password?(password.to_s)
Ich hoffe es hilft dir.
quelle
password == 'vinodsobale'
Übereinstimmungen. Das war, wennvinodsoble
es vom Typ iststring
(was wir alle sehen können), dannpassword
ist es auchstring
so,.to_s
dass man nichts anderes hervorbringt. Zweitens ist der Code, den Sie gerade erwähnen, Teil des internen Codes. Wie möchten Sie diesen implementieren, indem Sie den Code öffnen und ihn mit Affen patchen?password == 'vinosobale'
. Könnten Siepassword === 'vidodsobale'
Streichhölzer versuchen ? Könnten Sie diese Frage lesen - stackoverflow.com/questions/7156955/… ?Devise
DatabaseAuthenticatable#valid_password?
verwendet eine Methode namens "Encryptor::compare
Es werden 2 Objekte verwendet", das aktuell gespeicherte Kennwort und das neue Kennwort, das Sie vergleichen möchten. Ich glaube, dass diese Methode einen Nebeneffekt hat, der den zweiten Parameter in der Mitte ändert, sodass stattdessen das Objekt geändert wird von einmal wird es zweimal geändert, was zu einem falschen Ergebnis führt. Es kann also funktionieren, wenn Sie ein doppeltes Objekt des Passworts übergeben haben. kannst du versuchen zu benutzenvalid_password? password.dup
quelle
resource.valid_password?('vinodsobale')
jedes Mal, wenn ich dies ausführte , eine Zeichenfolge angegeben wird, die funktioniert hat, undreturn true
Möglicherweise liegt ein Problem mit der Codierung zwischen der Originalquelle und Ihrer Konsole vor. Wenn Sie ausführen
password.codepoints
, sollten Sie in der Lage sein, die tatsächliche Codierung zu sehen. Das Ausführen.codepoints
der unformatierten 'Passwort'-Zeichenfolge sollte zurückkehren[112, 97, 115, 115, 119, 111, 114, 100]
.quelle