概要
Devise を使っている際、encypted_password
が更新されるタイミングが気になったので、Rails Console
で動かしてみました。誰得メモです。
注意
書いてる本人は Devise 歴 30分程度の超にわかです。
実践
まずは普通に、password
とpassword_confirmation
に同じ値を格納してsave
し、encrypted_password
とauthenticatable_salt
の値を確認してみました。
pry > @user.password = @user.password_confirmation = "hogehoge"
=> "hogehoge"
pry > @user.save
=> true
pry > @user.encrypted_password
=> "$2a$04$vcBoXTQKDCWg7Ghyb1KlFu0cEdCMUhY1kGNKzAVrtQH6SlVb6TVem"
pry > @user.authenticatable_salt
=> "$2a$04$vcBoXTQKDCWg7Ghyb1KlFu"
普通の動作です。
なんとなく salt が気になったというだけで、authenticatable_salt
を何かよくわからないまま見てたので、中身が何かをここで確認しました。
pry > show-method @user.authenticatable_salt
From: devise-1.4.9/lib/devise/models/database_authenticatable.rb @ line 90:
Owner: Devise::Models::DatabaseAuthenticatable
Visibility: public
Number of lines: 3
def authenticatable_salt
self.encrypted_password[0,29] if self.encrypted_password
end
なんと、encrypted_password
の先頭ぶった切っただけでした。というわけで、以後、特に見ないことにします。
次は気になった動作です。save
せず、password
のみ変更し、同じ文字を連続で入れたりしてみました。
# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$I1OFA2gKnvA5w0QD6NDZ5OvBJ5u7S2eh3zLvqr5.PJQf4STsJEznG"
# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$IbK7Mqdi1iG5xPlqqkCrAelLKUyAUwNowaOfTNy32XgoDGr0qxtLO"
# 更新される
pry > @user.password = "foobar"
=> "foobar"
pry > @user.encrypted_password
=> "$2a$04$/0.33wLEmjZ0XUV2rZtrSuMQM"
# 更新される
pry > @user.password = "hoge"
=> "hoge"
pry > @user.encrypted_password
=> "$2a$04$rw/k92vw0TX9MLcejTCmBOw.WcM7YdfOYxFcJKos7ygKfVFqap8LG"
# 更新されない
pry > @user.password_confirmation = "hogege"
=> "hogege"
pry > @user.encrypted_password
=> "$2a$04$rw/k92vw0TX9MLcejTCmBOw.WcM7YdfOYxFcJKos7ygKfVFqap8LG"
save
しなくても、password_confirmation
に値を入れなくても、encrypted_password
が更新されています。そして同じ値を入れてもハッシュ値が別になっています。
また、password_confirmation
のみ変更した場合、encrypted_password
は更新されませんでした。
勝手にpassword
とpassword_confirmation
に同じ値が入っている状態でsave
したらencrypted_password
が更新されるんだと思い込んでましたが、どうやら違ったようです。
結論
Devise のencypted_password
はpassword
の値が変更されたタイミングで更新される。