##パスワードの安全性を高める
データベースにパスワードをそのまま保存すると万が一の場合があるので、パスワードを暗号化する必要がある。
###gem(ジェム)
gemとはrubyやrailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの。
その中でも今回は、bcrypt
という「暗号化するためのgem」を使う。
###Gemfile
railsにはインストールしたいgemを記述するGemfileがある。
gem 'bcrypt'
という風にGemfileに記述し、コンソールで以下のコマンドを打つ。
$ bundle install
bcryptをインストールすると、has_secure_passwoerd
というメソッドが使えるようになるので、パスワードを扱うモデルにこのメソッドを記述することで自動的にパスワードを暗号化するようになる。
class User < ApplicationRecord
has_secure_password
...
end
###password_digestカラム
has_secure_passwordメソッドは暗号化したパスワードをpassword_digestカラム
に保存する。
現在はパスワードをpasswordカラムに保存しているので、passwordカラム
をpassword_digest
に変更する必要がある。
マイグレーションファイルを作成。
$ rails g migration change_users_columns
マイグレーションファイルを編集。
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
def change
add_column :users,:password_digest,:string
remove_column :users,:password,:string
end
end
データベース更新。
$ rails db:migrate
password_digestカラムに暗号化されたパスワードを保存するためには、今まで通りpasswordに値を代入する。
こうすることで、has_secure_passwordによってpasswordに代入された値が暗号化され、password_digestカラムに保存される。
このため、既にあるpasswordに関するコードを変更する必要はなし。
###暗号化されたパスワードを用いたログイン
まず、フォームに入力されたメールアドレスに一致するユーザーを取得する。
その次にフォームに入力されたパスワードと取得したユーザーのパスワードが一致するか判定する。
といった流れになる。
def ligin
#フォームに入力されたメールアドレスに一致するユーザーを取得
@user = User.find_by(:email params[:email])
#フォームに入力されたパスワードと取得したユーザーのパスワードが一致するか判定
if @user && @user.authenticate(params[:password])
..
end
end
###authenticateメソッド
has_secure_passwordメソッドを有効にすると、authenticateメソッドが使用可能になる。
authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定する。