LoginSignup
5
1

More than 5 years have passed since last update.

【備忘録】暗号化されたpassword_digestカラムを導入する

Last updated at Posted at 2018-11-26

やりたいこと

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

これにて暗号化されたまま認証ができるようになった。

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