LoginSignup
0
1

More than 1 year has passed since last update.

Rails deviseの導入方法と仕様・仕組み

Last updated at Posted at 2021-08-01

deviseとは

ユーザー管理機能の実装を補助してくれるRubyのgem(ライブラリ)です。
新規登録・ログイン・ログアウトやメール認証・SNS認証等の機能を実装でき、セキュリティ的にも安全なものが作れます。

devise導入

Railsのアプリケーションディレクトリ直下にあるGemfileの末尾に以下を追記します。

gem 'devise'

ターミナルでRailsのアプリケーションディレクトリに移動し、以下コマンドを実行してインストールします。

bundle install # gemインストール
rails g devise:install # deviseの設定ファイル生成

認証用のモデルを作成

認証用のモデルを作成します。以下ではuserモデルを作成していますがcustomermail_useradmin等好きなモデル名でOKです。

rails g devise user

migrationファイルやmodelファイルが生成されます。
rails g model userとの違いは以下3点です。

  • migrationファイルにemailカラムやencrypted_passwordカラム等の記述が最初からされているものが生成される
  • modelファイルにdevise :database_authenticatable, ~ ::validatableの記述が最初からされているものが生成される
  • routes.rbdevise_for :モデル名の記述が最初からされているものが生成される

migrationファイルの編集・実行

migrationファイルを編集します。
必要に応じてnameカラム等追加したいカラムを追加します。
また以下機能のカラムを必要に応じてコメントアウト・アンコメントします。

機能 概要 デフォルト
Recoverable パスワードリセット機能 有効
Rememberable ログイン状態を保持する機能 有効
Trackable ログイン回数や最終ログイン日時等の追跡をする機能 無効
Confirmable メール認証機能 無効
Lockable アカウントロック機能(指定回数連続で認証失敗するとアカウントをロックする機能) 無効

rails g db:migrateを実行してDBのテーブルを生成します。

コントローラーの作成

deviseのデフォルトの動作を改変する場合はrails g devise:controllers usersでコントローラーを作成します。
app/models/users/ディレクトリ以下に複数のコントローラーが生成されるので、必要なもの(改変したいコントローラー)のみroutes.rbに以下のように記述して読み込ませます。

routes.rb
      devise_for :users, controllers: {
        sessions: 'users/sessions'
      }

ビューの生成

deviseのデフォルトのビューを改変する場合はrails g devise:views usersでビューを作成します。
app/views/users/ディレクトリ以下にビューファイルが生成されるので、改変したい箇所を編集します。

モデルの設定

modelファイルに記述されているdevise :database_authenticatable, ~ ::validatableを必要に応じて削除・追記します。以下各説明です。
これらの設定はdeviseのmodel作成コマンドではなく通常のrails g model ~コマンドで生成したモデルにも設定できます。

:database_authenticatable

メールとパスワードを使った認証をしたい場合に設定します。
パスワード保存時に自動でハッシュ化してくれたり、ログイン・ログアウトのセッション管理もしてくれます。
これを設定したモデルにemailencrypted_passwordカラムが無いとエラーになります。
routes.rbdevise_forにこれを設定したモデルを指定すると、ログイン・ログアウト用のルーティングが設定されます。

:authenticatable

メールとパスワードを使った認証以外の認証をしたい場合に設定します。
SNS認証用のモデルにはこちらを設定するのが良さそうです。
:database_authenticatableと異なり、ログイン・ログアウト用のルーティングは追加されません。
モデルにクラスメソッドやインスタンスメソッドを追加します。詳細は以下のドキュメントに記載されています。
https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable

:registerable

新規登録機能を実装したい場合に設定します。
SNS認証用のモデルには必要ありません。
routes.rbdevise_forにこれを設定したモデルを指定すると、新規登録用のルーティングが設定されます。

  • registrations#cancel
  • registrations#new
  • registrations#edit
  • registrations#update
  • registrations#update
  • registrations#destroy
  • registrations#create

:validatable

メールとパスワードのバリデーションを追加します。
自分でバリデーションを設定する場合は必要ありません。
追加されるバリデーションは以下の通りです。

:confirmable

メール認証機能を実装する場合に設定します。
routes.rbdevise_forにこれを設定したモデルを指定すると、新規登録用のルーティングが設定されます。

  • confirmations#new
  • confirmations#show
  • confirmations#create

アカウント登録時に認証用トークンを生成し、認証用トークンを付与した本登録用URLを記載したメールをユーザーに送信してくれます。
(confirmed_atが空の状態で保存されると、メールが送信されます。)

これを利用する時はRailsの送信用メールサーバーの設定をする必要があります。

:omniauthable

OAuth認証(SNS認証等)を実装する場合に設定します。
別途gemをインストールする必要があります。
routes.rbdevise_forにこれを設定したモデルを指定すると、OAuth認証のコールバックURLのルーティングが設定されます。

:recoverable

パスワードリセット機能を実装する場合に設定します。

:rememberable

ログイン状態を保持する機能を実装する場合に設定します。

:lockable

アカウントロック機能を実装する場合に設定します。
指定回数ログインに失敗するとアカウントをロックします。
アカウントロックの解除方法はメールでの解除・時間経過での解除の2つ用意されており、両方を設定することも可能です。
https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Lockable

:timeoutable

ログインセッションの有効期限機能を実装する場合に設定します。
設定された有効期限を過ぎるとログインページへリダイレクトされます。
https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Timeoutable

:trackable

ログイン回数やログイン日時・IPアドレスを記録する機能を実装する場合に設定します。

ルーティングの設定

devise_fordevise_scopeでdeviseのルーティングを追加します。
複数の認証用モデルが存在する場合はそれぞれの認証用モデルに設定することが可能です。

devise_for :モデル名(複数形)ではそのモデルにdeviseメソッドで設定されてる内容を読み取ってそれに対応したルーティングを追加します。
deviseのデフォルトのコントローラーを改変する場合はコントローラーを指定します。
以下はセッション管理コントローラーと新規登録用コントローラーとメール認証のコントローラーを設定している例です。

routes.rb
      devise_for :users, controllers: {
        sessions: 'users/sessions',
        registrations: 'users/registrations',
        confirmations: 'users/confirmations'
      }

独自のルーティングを追加する場合はdevise_scopeを利用します。
こちらはdevise_scope :モデル名(単数形)にします。以下は例です。

routes.rb
      devise_scope :user do 
        patch 'users/confirmation',   to: 'users/confirmations#confirm'
      end

deviseのヘルパーメソッド

deviseは以下のような便利なヘルパーメソッドを用意してくれています。
以下userモデルの例です。user以外の名前のモデル名を付けている場合はメソッド名もモデル名に対応して変わります。
(adminモデルならadmin_sign_in?等)

  • user_sign_in?: ユーザーがログインしているかtrue/falseで返します。
  • current_user: 現在ログイン中のユーザーのモデルインスタンスを返します。ログインしていなければnilを返します。
  • before_action :authenticate_user!: ログインしていなければログインページへ飛ばします。
    • ApplicationControllerまたは個別のコントローラーに設定します。
    • 特定のページに設定したい場合はonlyexceptオプションを利用します。

user_sign_in?メソッドは全てのコントローラー・ビュー内で利用できます。
current_userメソッドはdevise_forが呼び出された際に指定したモデル名に合わせて、そのdevise_forで設定されるコントローラーのアクション・及びそのビューでのみ利用できます。

ストロングパラメーター

:database_authenticatableを設定しているモデルにカラムを追加した場合は以下のようにストロングパラメーターを設定します。
以下の例ではlast_nameカラムとfirst_nameカラムを設定しています。
user_details等の別のモデルに追加カラムを分離している場合は以下の設定は不要です。

application_controller.rb
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name, :first_name])
  end

参考

最後に

間違い等あれば指摘いただけると幸いです。

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