目的
パスワードのセキュリティを強化する。
手段
has_secure_passwordを使ってパスワードをハッシュ化する。
・ハッシュ化は、訳のわからない暗号みたいな文字列に変換すること。
・has_secure_passwordでハッシュ化されたパスワードは、同じ文字列で生成すれば常に同じ値になるので一致しているかどうかをチェックする際に使える。
・has_secure_passwordでハッシュ化したパスワードは、元のパスワードそのものに戻すことができないので、ハッシュ化されたパスワードを奪われたとしても何の問題もないのでパスワードのセキュリティが強固になる。
手順
1.Userモデル作成時のパスワード属性をpassword_digestとする。
➡︎has_secure_passwordを使う際の命名規則なので必須。
2.Gemfileにbcryptというgemを追加して、インストールする。
➡︎bcryptというgemをインストールすることで、has_secure_passwordを使えるようになりパスワードをハッシュ化できるようになる。
➡︎$ bundle installコマンドを忘れずに。
3.Userモデルにhas_secure_passwordを記述。
➡︎Userモデル内にhas_secure_passwordを記述したことにより、password属性とpassword_confirmation属性の2つの属性が追加される。データベースのカラムとは対応していない属性。
➡︎どういうことかというと、この2つはユーザーに入力を求めるためだけの属性で、この2つの属性をユーザーに入力させる
ことで、Railsはこの2つの一致をチェック
した後、一致していたらそのパスワードをハッシュ化
してデータベースのpassword_digest属性に格納される
ようになっている。
以上の記述を行うことで、ユーザーの新規登録時に入力したパスワードはハッシュ化されるようになる。
ターミナル$ rails g model user ... ... password_digest:string
db/migrate/[timestamps]_create_users.rbclass CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| . . . t.string :password_digest . . . end end end
ターミナル$ rails db:migrate
Gemfilegem 'bcrypt', '~> 3.1.7'
ターミナル$ bundle install
app/models/user.rbclass User < ApplicationRecord has_secure_password . . . end
試しにコンソールで確認してみる。
$ rails c --sandbox > user = User.new(..., password: '123456', password_confirmation: '123456') > user.save => true >user.password_digest => 'fflafbnalwefhhhawkleufhb'
ユーザーにpasswordとpassword_confirmationに任意の値を入力させれば、2つの属性が一致しているかどうかを検証した後に、ちゃんとハッシュ化されたパスワードがpassword_digest属性に保存されている事がわかる