【Rails】has_secure_passwordをまとめてみました

rails

今回はセキュアなパスワードによる認証機能のrailsのメソッドであるhas_secure_passwodを掘り下げていきたいと思います。

has_secure_passwordとは

まずhas_secure_passwordとは何かというとWebアプリケーションでユーザーの登録の際に、パスワード等のユーザー認証機能を実装と思いますが、これをいちからすべて実装しようとすると、とても大変です。しかし、これをユーザーモデルに追加するだけでユーザー認証機能が使えるようになり実装が簡単にできてしまうrailsのメソッドになります。

has_secure_passwordで使えるようになる機能

Userモデルにこのメソッドを追加すると、次のような機能が使えるようになります。

  • セキュアにハッシュ化したパスワードを、データベース内のpassword_digestという属性に保存できるようになる。
  • 2つのペアの仮想的な属性 (passwordpassword_confirmation) が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される
  • authenticateメソッドが使えるようになる (引数の文字列がパスワードと一致するとUserオブジェクトを、間違っているとfalseを返すメソッド) 。
用語の整理
セキュア・・安全な
ハッシュ化・・ハッシュ関数を使って入力されたデータを元に戻せないデータにする処理。
ハッシュ関数・・入力されたデータに対して適当な値を返してくれる関数。

has_secure_password機能を使う条件

上のように様々な機能が使えるようになりますが一つだけ条件があります。それは

モデル内にpassword_digestという属性が含まれていること。

つまりUserモデルにpassword_digestカラムを追加する必要があるということです。

has_secure_passwordの追加の方法

1.Userモデルにhas_secure_passwordを記述する。

ユーザー認証を実装したい場合は、app/models/user.rb に以下のように記述します。

class User < ApplicationRecord
 .
 .
 .
 has_secure_password

2.モデルにpassword_digest属性を追加する

usersテーブルにpassword_digestカラムを追加するためマイグレーションファイルを作成するために次のコマンドを実行します。

$ rails generate migration add_password_digest_to_users password_digest:string

これでusersモデルにpassword_digestという属性のstring型のものが生成されました。これが成功すると

db/migrate/[timestamp] に _add_password_digest_to_users.rb

が作成されます。

db/migrate/[timestamp]_add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.1]
  def change
   add_column :users, :password_digest, :string
  end
end

これを適用させるために

$ rails db:migrate

を実行します。

3.bcryptをGemfileに追加する

has_secure_passwordを使用してパスワードをハッシュ化するにはbcryptが必要となるためbcrypt gemをGemfileに追加します。

source 'https://rubygems.org'
.
.
gem 'bcrypt'


そしてbundle install を実行します。

$ bundle install

以上でhas_secure_passwordの実装が完了となります!

has_secure_passwordは簡単にユーザー認証機能を実装してくれるのでとても便利ですね。

またhas_secure_passwordは裏でどんなことをしているのかというのも知りたいので、別の記事で書いていきたいと思います。

 

参考 Ruby on Rails チュートリアル

コメント