やりたいこと
bcrypt
をもちいてモデルのパスワードカラムを暗号化する。
(最近Deviceなどの既存ツールを使うことが多く、自分で暗号化パスワードの設定をしようと思った時に毎回調べて時間がかかってしまったのでまとめることにした)
前提
データベース名:Room
手順
bcryptのインストール
Gemfileに以下を入力して、ターミナルにてbundle install するだけ。
Gemfile
gem 'bcrypt'
ターミナル
$ bundle install
これでbcryptが使えるようになった
has_secure_passwordメソッドの追加
指定のモデルのrbファイルにvalidationを加える要領で以下を追記
app/models/room.rb
class Room < ApplicationRecord
has_secure_password
・
・
・
end
これで自動的にパスワードを暗号化して保存できるようになった。
しかしこのままでは暗号化したパスワードの保存先がないため使えない。
password_digestカラムの追加
生成された暗号化パスワードを保存するpassword_digestカラムを作成する
ターミナル
$ rails g migration AddPasswordDigestColumnToRooms
app/db/migrate/add_password_digest_column_to_rooms.rb
class AddPasswordDigestColumnToRooms < ActiveRecord::Migration[5.2]
def change
add_column :rooms, :password_digest, :string
remove_column :rooms, :password, :string #既にpasswordカラムがあれば削除しておく
end
end
ターミナル
$ rails db:migrate
これでhas_secure_password
によって暗号化されたパスワードが保存できる準備が整った。
###【おまけ】認証方法
has_secure_password
によって使えるようになったauthenticate
メソッドによってパスワード認証を行う。
(「room_id」と「password」を入力させてrooms#example
に送信したと想定)
app/controllers/rooms_controller.rb
class RoomsController < ApplicationController
def example
@room = Room.find_by(room_id: params[:room_id]) #room_idで認証したいroomを指定する
if @room && @room.authenticate(params[:password]) #room_idが存在する、かつ、パスワードが入力されたものと一致するか調べる
#ここにやりたい処理を書く
end
end
end
これにて暗号化されたまま認証ができるようになった。