今回はセキュアなパスワードによる認証機能のrailsのメソッドであるhas_secure_passwodを掘り下げていきたいと思います。
has_secure_passwordとは
まずhas_secure_passwordとは何かというとWebアプリケーションでユーザーの登録の際に、パスワード等のユーザー認証機能を実装と思いますが、これをいちからすべて実装しようとすると、とても大変です。しかし、これをユーザーモデルに追加するだけでユーザー認証機能が使えるようになり実装が簡単にできてしまうrailsのメソッドになります。
has_secure_passwordで使えるようになる機能
Userモデルにこのメソッドを追加すると、次のような機能が使えるようになります。
- セキュアにハッシュ化したパスワードを、データベース内の
password_digest
という属性に保存できるようになる。 - 2つのペアの仮想的な属性 (
password
とpassword_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は裏でどんなことをしているのかというのも知りたいので、別の記事で書いていきたいと思います。
コメント