#はじめに
パスワードを実装してみたのでメモ
userモデルにパスワードを実装していきます
##1.has_secure_password
userモデルに
class User < ApplicationRecord
has_secure_password
end
と追加することで
(1).セキュアにハッシュ化したパスワードを、データベース内のpassword_digest
という属性に保存できるようになる。(条件あり)
(2).2つのペアの仮想的な属性 (password
とpassword_confirmation
) が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。
(3).authenticate
メソッドが使えるようになる (引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド) 。
この3つの機能が使えるようになります。順番に解説していきます。
###(1)
ここでいうセキュアとは安全という意味です。設定したパスワードを暗号化(ハッシュ化)させて、password_dijest
というカラムに保存できるようにします。すなわち、Userモデルにpassword_dijest
カラムを追加する必要があります(先ほどの条件とはこのこと)。
rails generate migration add_password_digest_to_users password_digest:string
rails db:migrate
また、パスワードを暗号化するためのgemとして、bcrypt
(最新ので大丈夫です)というgemをgemfail
に追加してbundle install
する必要があります。
###(2)
password
とpassword_confirmation
のセットというのはパスワードとパスワード(確認用)ということです。ちなみに、has_secure_password
をUserモデルに追加したことで自動的にこの二つのバリデーションが追加されるようになっていますが、これは更新時には適用されないので
validates :password, presence: true
と追加しておきましょう。パスワードの長さを制限したいときは
validates :password, presence: true, length: {minimum:5}
とすれば5文字以上のパスワードに制限することができます。
###(3)
authenticateメソッドではその説明の通り、引数の文字列がパスワードと一致しているか確認してくれます。
User.create(name: "saber",email: "saber@seihai.com",password: "shirou",password_confirmation: "shirou")
user = User.find_by(name:"saber")
user.authenticate("kotomine") => false
user.authenticate("kiritugu") => false
user.authenticate("shirou") => true
といった感じでそのユーザーのパスワードの正誤を確認してくれます。
autuenticate
では引数のパスワードをそのままデータベースの値と参照するわけではなく、一度ハッシュ化(暗号化)してからその値をデータベースにある値と参照してくれます。
##最後に
has_secure_password
を自分なりにかみくだいてみました。参考になれば幸いです。