LoginSignup
29
25

More than 5 years have passed since last update.

Deviseのpassword変更時のencrypted_passwordの挙動

Last updated at Posted at 2015-03-02

概要

Devise を使っている際、encypted_passwordが更新されるタイミングが気になったので、Rails Consoleで動かしてみました。誰得メモです。

注意

書いてる本人は Devise 歴 30分程度の超にわかです。

実践

まずは普通に、passwordpassword_confirmationに同じ値を格納してsaveし、encrypted_passwordauthenticatable_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は更新されませんでした。

勝手にpasswordpassword_confirmationに同じ値が入っている状態でsaveしたらencrypted_passwordが更新されるんだと思い込んでましたが、どうやら違ったようです。

結論

Devise のencypted_passwordpasswordの値が変更されたタイミングで更新される。

29
25
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
25