- 更新日: 2016年11月8日
- Devise
Rails の認証プラグイン Devise での Strong Parameters について
公式の devise readme を中心に、Rails で Devise を使う際の Strong Parameters について調べたのでまとめました。
— 環境 —
Rails 5.0.0.1
Devise 4.2.0
【追記 2016/11/08】
Devise 4 における Strong Parameters の Parameter Sanitizer API が変更されていたので、Devise 4 環境での Strong Parameters について追記しました。
https://github.com/plataformatec/devise
【追記ここまで】
— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2
Devise の3つのアクションと許可パラメータ
ビューをカスタマイズする場合、新しい属性をフォームに追加する場合があります。Rails4 はパラメータのサニタイズをモデルからコントローラーに移動したため、Devise も同様にパラメータのサニタイズをコントローラーで行います。
Devise には、パラメータのセットがモデルに伝えられるのを許可する3つのアクションがある。そのためにサニタイズを要求します。それらのアクション名とデフォルトで許可されているパラメータは以下の通りです。
sign_in (Devise::SessionsController#new)
sign_in メソッドは、認証に必要なキー(例えば email)のみを許可します。
sign_up (Devise::RegistrationsController#create)
sign_up メソッドは、認証に必要なキーに加え、パスワードとパスワード確認を許可します。
account_update (Devise::RegistrationsController#update)
account_update メソッドは、認証に必要なキーに加え、パスワード、パスワード確認と現在のパスワードを許可します。
追加のパラメータを許可する場合(Devise 4)
Devise 4 では、Devise::ParameterSanitizer#permit を使って、Strong Parameters の設定を行います。username を許可するフィールドとして追加したい場合。
1 2 3 4 5 6 7 8 9 |
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end |
accepts_nested_attributes_for を使っている場合などで、Devise デフォルトの挙動をカスタマイズしたい場合は、ブロックを渡すようにする。
1 2 3 4 5 |
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_in) do |user_params| user_params.permit(:username, :email) end end |
Devise 3 までの例ですが、accepts_nested_attributes_for 利用時の stackoverflow 参考。
Allowing a nested attribute for a User with Devise in Rails 4 – Stack Overflow
独自のサニタイザーを定義する方法(Devise 4)
複数の Devise モデルがあって、モデルごとに異なるサニタイザーを使いたい場合は、Devise::ParameterSanitizer を継承した独自のサニタイザーモデルを作成する方法が利用できます。
1 2 3 4 5 6 |
class User::ParameterSanitizer < Devise::ParameterSanitizer def initialize(*) super permit(:sign_up, keys: [:username, :email]) end end |
コントローラーで devise_parameter_sanitizer メソッドをオーバーライドして、作成したサニタイザーを使うようにする。
1 2 3 4 5 6 7 8 9 10 11 |
class ApplicationController < ActionController::Base protected def devise_parameter_sanitizer if resource_class == User User::ParameterSanitizer.new(User, :user, params) else super # Use the default one end end end |
以上が、Devise 4 で Strong Parameters によるパラメータ許可のための書き方となります。
以降は記事の初回公開時の情報で、Devise 3 までの内容となります。
追加のパラメータを許可する場合(Devise 3)
追加のパラメータを許可したい場合(遅延評価の方法で)、ApplicationController でシンプルな before filter を使う方法があります。
1 2 3 4 5 6 7 8 9 |
class ApplicationController < ActionController::Base before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :username end end |
完全に Devise のデフォルトを変更するかカスタマイズした振舞を呼び出すには、ブロックを渡す方法も使える。
1 2 3 |
def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email) } end |
独自のサニタイザーを定義する方法(Devise 3)
もし複数の Devise のモデルを使っている場合、それぞれのモデルで異なるパラメータのサニタイザーをセットしたい場合があるかもしれない。この場合、Devise::ParameterSanitizer を継承して独自のロジックを組み込み、サニタイザーを定義します。
1 2 3 4 5 |
class User::ParameterSanitizer < Devise::ParameterSanitizer def sign_in default_params.permit(:username, :email) end end |
それから、コントローラーでそのサニタイザーを設定します。
1 2 3 4 5 6 7 8 9 10 11 |
class ApplicationController < ActionController::Base protected def devise_parameter_sanitizer if resource_class == User User::ParameterSanitizer.new(User, :user, params) else super # Use the default one end end end |
上の例では、ユーザーの許可されたパラメータを、:username と :email を許可するようにオーバーライドしています。パラメータを設定するための非遅延評価の方法は、カスタマイズしたコントローラーで上のように before filter を定義する方法が使えるでしょう。コントローラーを設定しカスタマイズする方法は、以降のセクションで詳細を記します。→ Rails4 にて Devise でユーザー登録・ログイン認証・認可の機能を追加 | EasyRamble を参照。
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Rails + Devise で admin ユーザー(管理者)を削除できないようにする
- 初回公開日: 2013年12月7日
Leave Your Message!