deviseとは?
Railsのgemの一つでログイン機能を簡単に実装してくれます。
インストール手順
Gemfileに下記の記述をする。
1 |
gem 'devise' |
bundleインストールする。
1 |
bundle install |
deviseの設定
deviseに関連するファイルをジェネレータで自動生成します。
1 |
rails g devise:install |
deviseに関連するユーザーモデルを作成します。
1 |
rails g devise user |
マイグレーションを実施します。
1 |
rails db:migrate |
使い方
基本的にデフォルトの機能の利用範囲であれば、一度ログインしたらdeviseの認証画面はログアウトするまでは目にすることはありません。deviseのビューやコントローラの処理自体も目に見える場所には出てこないので、マイグレーションのDB周り以外はアプリとは独立しているイメージになります。(ただ、HTML等のビュー部分に関してはコマンドでアプリ内に組み込んでカスタマイズすることは可能です。)
サインアップ
Railsサーバーを起動して下記URLにアクセスするとユーザーのサインアップページができています。
1 |
http://localhost:3000/users/sign_up |
なお、ログイン状態になっている場合は再度サインアップの画面にアクセスしたとしてもRailsアプリのrootに飛ばされます。
サインイン(ログイン画面)
下記URLはログインページになります。
1 |
http://localhost:3000/users/sign_in |
なお、ログイン状態になっている場合は再度ログイン画面にアクセスしたとしてもRailsアプリのrootに飛ばされます。
サインアウト(ログアウト)
「/users/sign_out(destroy_user_session_path)」に対してHTTPのDELETEメソッドを実行することでログアウトさせることが可能になります。Railsのlink_toビューヘルパーを使ったサンプルは下記のようになります。
1 2 3 4 5 |
<%= link_to 'ログアウト', destroy_user_session_path, class: 'dropdown-item', method: :delete %> |
手軽にログアウト動作を確認したい場合
手軽にURLを叩いてログアウト処理を実施したい場合はGETでリクエストしてもログアウトが行われるように下記のようなルーティング設定を追加すると良いでしょう。
1 2 3 4 5 6 7 8 |
Rails.application.routes.draw do devise_for :users # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html devise_scope :user do ★追加 get '/users/sign_out' => 'devise/sessions#destroy' ★追加 end ★追加 end |
試しに上記ルーティング設定を追加後に下記URLにアクセスすればサインアウトが行われます。
1 |
http://localhost:3000/users/sign_out |
「ログイン画面」や「サインアップ画面」のデザインを変えたい場合
下記コマンドを実行してdeviseのビューファイルをRailsアプリ内に組み込みます。
1 |
rails g devise:views |
ログイン画面なら下記HTMLになります。
1 |
views/devise/sessions/new.html.erb |
サインアップ画面であれば下記HTMLになります。
1 |
views/devise/registrations/new.html.erb |
ログイン、ログアウト後に遷移する画面設定
各コントローラの基底クラスである「ApplicationController」に対して下記のように設定します。
1 2 3 4 5 6 7 8 9 10 11 |
class ApplicationController < ActionController::Base # ログイン後に遷移するpathを設定 def after_sign_in_path_for(resource) tool_index_path end # ログアウト後に遷移するpathを設定 def after_sign_out_path_for(resource) tool_index_path end end |
deviseの機能
作成したdeviseのユーザーモデルを確認すると下記のようにシンボルがたくさんありUserモデルにて使用できる機能になります。
1 2 3 4 5 6 |
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end |
デフォルト機能
Database Authenticatable
DBに保存されたパスワードが正しいか検証を行ってくれます。パスワードの暗号化も行ってくれます。実務でもほぼ間違いなく使われます。
Recoverable
パスワードをリセットしてくれます。実務でもたまに使われます。
以下のパスが自動で生成されます。
- new_{モデル名}_password_path
- edit_{モデル名}_password_path
- {モデル名}_password_path
パスワードの再発行画面は下記です。サインアウトしている状態のみで使えます。
http://localhost:3000/users/password/new
パスワードを再発行すると下記のカラムに値が入ります。
- reset_password_token
- reset_password_sent_at
Registerable
Userの登録、削除、編集等を行ってくれます。実務でもたまに使われます。
設定すると以下のパスが自動で生成されます。
- cancel_{モデル名}_registration_path
- new_{モデル名}_registration_path
- edit_{モデル名}_registration_path
- {モデル名}_registration_path
Rememberable
20日間ログインしたままにするというような永続ログインを実現します。実務でもたまに使われます。
ログイン画面にある「Remember me」のチェックボックスをクリックした際の挙動です。
ログインすると下記のカラムに日付が入り計測されます。ログアウトするとカラム内容がnilになります。
- remember_created_at
Validatable
バリデーション機能を提供してくれます。実務でもほぼ間違いなく使われます。
その他機能
Omniauthable
SNS認証を行うためのモジュールです。他にもGemが必要になります。
Confirmable
登録後メールを送りメールをクリックすると本登録させるという仕組みを実装してくれます。
Trackable
ログイン時間や回数等を保管しておき分析に役立てます。実務でもほぼ間違いなく使われます。
Timeoutable
ログインしたままのアカウントのセッションを破棄します。
Lockable
ログインに何度も失敗するとアカウントをロックさせる機能です。
マイグレーションファイル
「rails g devise user」によりデフォルトで作成されたマイグレーションファイルになります。上記で紹介したデフォルトで使う機能別(Database Authenticatable等)に必要なカラム名や設定等が記載されています。デフォルトでは使用されない機能はコメントアウトされているので使いたい場合はコメントを外してマイグレーションを実行する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# frozen_string_literal: true class DeviseCreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable # t.integer :sign_in_count, default: 0, null: false # t.datetime :current_sign_in_at # t.datetime :last_sign_in_at # t.string :current_sign_in_ip # t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end |
現在ログイン中であるかの判定
現在ログイン中のユーザーは「current_user」というUserモデルの変数に値が入ることになります。ログイン中であれば下記のメソッドを使えばtrueが返り、ログアウト中であればfalseが返ります。
1 |
current_user.present? |
一般ユーザーと管理者を分ける。
deviseのユーザーテーブルにadminという管理者を示すフラグを追加します。
1 |
rails g migration add_admin_to_users admin:boolean |
生成されたマイグレーションファイルを実行します。
1 |
rails db:migrate |
後はプログラム内で下記のような記述を実施すれば管理者特有の処理を実装可能です。
1 2 3 |
if current_user.try(:admin?) #ユーザーが管理者である場合に行わせたい処理 end |
devise_invitableとは?
deviseに招待機能を追加します。
実装手順
Gemfileに下記を追加する。
1 |
gem 'devise_invitable' |
インストール
1 |
bundle install |
翻訳ファイルを作成する。
1 |
rails g devise_invitable:install |
deviseと紐づいているモデルに「devise_invitable」用のカラムを追加する。
1 |
rails g devise_invitable User |
追加されるカラム
カラム名 | 説明 |
---|---|
invitation_token | |
invitation_created_at | |
invitation_sent_at | |
invitation_accepted_at | |
invitation_limit | |
invited_by_type | |
invited_by_id | どのユーザーに招待されたかのIDが入る。 |
invitations_count | 招待メールを送った人数が自動でカウントされる。 |
ビューを作成します。
1 |
rails g devise_invitable:views |
なお、コントローラはデフォルトの処理から変えたい場合は「Devise::InvitationsController」を継承してメソッドをオーバーライドして作成するようにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Users::InvitationsController < Devise::InvitationsController def new super end def create super end def edit super end def update super end def destroy super end end |
ルーティング設定を追加
1 2 3 |
devise_for :users, controllers: { invitations: 'users/invitations' } |
また、「app/views/devise/mailer/invitation_instructions.html.erb」にある下記内容がメール送信内容になっています。
1 2 3 4 5 6 7 8 9 10 11 |
<p><%= t("devise.mailer.invitation_instructions.hello", email: @resource.email) %></p> <p><%= t("devise.mailer.invitation_instructions.someone_invited_you", url: root_url) %></p> <p><%= link_to t("devise.mailer.invitation_instructions.accept"), accept_invitation_url(@resource, invitation_token: @token) %></p> <% if @resource.invitation_due_at %> <p><%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %></p> <% end %> <p><%= t("devise.mailer.invitation_instructions.ignore") %></p> |
デフォルトで、「root_url」という構文を使っていて下記の設定をしないとエラーになるので注意しましょう。
config/environments/development.rb
1 |
config.action_mailer.default_url_options = { host: '任意のドメイン名' } |
この記事へのコメントはありません。