LoginSignup
0
1

More than 3 years have passed since last update.

has_secure_passwordについて

Posted at

はじめに

パスワードを実装してみたのでメモ
userモデルにパスワードを実装していきます

1.has_secure_password

userモデルに

user.rb
class User < ApplicationRecord
has_secure_password
end

と追加することで
(1).セキュアにハッシュ化したパスワードを、データベース内のpassword_digestという属性に保存できるようになる。(条件あり
(2).2つのペアの仮想的な属性 (passwordpassword_confirmation) が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。
(3).authenticateメソッドが使えるようになる (引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド) 。
この3つの機能が使えるようになります。順番に解説していきます。

(1)

ここでいうセキュアとは安全という意味です。設定したパスワードを暗号化(ハッシュ化)させて、password_dijestというカラムに保存できるようにします。すなわち、Userモデルにpassword_dijestカラムを追加する必要があります(先ほどの条件とはこのこと)。

console
rails generate migration add_password_digest_to_users password_digest:string

rails db:migrate

また、パスワードを暗号化するためのgemとして、bcrypt(最新ので大丈夫です)というgemをgemfailに追加してbundle installする必要があります。

(2)

passwordpassword_confirmationのセットというのはパスワードとパスワード(確認用)ということです。ちなみに、has_secure_passwordをUserモデルに追加したことで自動的にこの二つのバリデーションが追加されるようになっていますが、これは更新時には適用されないので

user.rb
validates :password, presence: true

と追加しておきましょう。パスワードの長さを制限したいときは

user.rb
validates :password, presence: true, length: {minimum:5}

とすれば5文字以上のパスワードに制限することができます。

(3)

authenticateメソッドではその説明の通り、引数の文字列がパスワードと一致しているか確認してくれます。

console
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を自分なりにかみくだいてみました。参考になれば幸いです。

0
1
0

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
0
1