追加する方法は簡単で、modelにhas_secure_passwordを追加するだけ。
追加することによって次のような機能を使えるようになる。
・ セキュアにハッシュ化したパスワードを、データベース内のpassword_digest属性に保存できるようになる。
・ 2つの仮想的な属性(passwordとpassword_confirmation)が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。
・ authenticateメソッドが使えるようになる(引数の文字列がパスワードと一致するとUserオブジェクトを返し、一致しない場合はfalseを返すメソッド)。
具体的な方法
まずはモデル内にpassword_digestを含ませる必要がある。
以下のコマンドを実施。
$ rails generate migration add_password_digest_to_users password_digest:string
からのdb:migrateを実行。
$ rails db:migrate
has_secure_passwordを使ってハッシュ化するためには、bcryptライブラリを使う。
gemfileに追加する。
gem "bcrypt"
bundle installは忘れずに。
$ bundle install
ここまできたらついにmodelにhas_secure_passwordを追加する。
class User < ApplicationRecord
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: true
has_secure_password
end
ここで何らかのテストが失敗している可能性があります。
has_secure_passwordには、仮想的なpassword属性とpassword_confirmation属性に対してバリデーションをする機能も(強制的に)追加されているので、もしsetupなどを用いて@user変数を定義している場合は、passwordとpassword_confirmationも追加してあげましょう。
def setup
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar")
end
また、パスワードはセキュリティの観点から最低6文字以上に設定することをおすすめします。
こちらも簡単で、モデル内にvalidateをかけるだけです。
class User < ApplicationRecord
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: true
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
end