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 を許可するフィールドとして追加したい場合。

accepts_nested_attributes_for を使っている場合などで、Devise デフォルトの挙動をカスタマイズしたい場合は、ブロックを渡すようにする。

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 を継承した独自のサニタイザーモデルを作成する方法が利用できます。

コントローラーで devise_parameter_sanitizer メソッドをオーバーライドして、作成したサニタイザーを使うようにする。

以上が、Devise 4 で Strong Parameters によるパラメータ許可のための書き方となります。

以降は記事の初回公開時の情報で、Devise 3 までの内容となります。

追加のパラメータを許可する場合(Devise 3)

追加のパラメータを許可したい場合(遅延評価の方法で)、ApplicationController でシンプルな before filter を使う方法があります。

完全に Devise のデフォルトを変更するかカスタマイズした振舞を呼び出すには、ブロックを渡す方法も使える。

独自のサニタイザーを定義する方法(Devise 3)

もし複数の Devise のモデルを使っている場合、それぞれのモデルで異なるパラメータのサニタイザーをセットしたい場合があるかもしれない。この場合、Devise::ParameterSanitizer を継承して独自のロジックを組み込み、サニタイザーを定義します。

それから、コントローラーでそのサニタイザーを設定します。

上の例では、ユーザーの許可されたパラメータを、:username と :email を許可するようにオーバーライドしています。パラメータを設定するための非遅延評価の方法は、カスタマイズしたコントローラーで上のように before filter を定義する方法が使えるでしょう。コントローラーを設定しカスタマイズする方法は、以降のセクションで詳細を記します。→ Rails4 にて Devise でユーザー登録・ログイン認証・認可の機能を追加 | EasyRamble を参照。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!