0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

deviseのdevise_parameter_sanitizer.permitとconfig.authentication_keysで詰まった話

Posted at

TL;DR

認証キーと許可するパラメータの違いを把握していなかった。

  • config.authentication_keysはdeviseの認証として使われるものであり、自動的にストロングパラメータとして登録されている
  • devise_parameter_sanitizer.permitはストロングパラメータの設定であり、deviseの認証として使われるものではない

誤解していたこと

devise_parameter_sanitizer.permitとconfig.authentication_keysは同じもの!
↑誤りですので気をつけてください。。

つまり、

application_controller.rb
devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
config/initializers/devise.rb
config.authentication_keys = [:name]

「この2つはsign_inとsign_upに関しては同じことである。」、「どちらの記述でも同じ!」と思っていました、、((反省

config.authentication_keysは何か

config.authentication_keysは認証用のキーであるため、「本当にあなたか確認しますね」ということです。どうやって確認するかというと、ここで設定したパラメータで確認しています。defaultではemailで確認します。
つまり、

config/initializers/devise.rb
## nameで本人認証します
config.authentication_keys = [:name]

## emailで本人認証します(default)
# config.authentication_keys = [:email]
## or
config.authentication_keys = [:email]

## ageで本人認証します
config.authentication_keys = [:age]

sign_upの時は関係ない?!

config.authentication_keysは認証用のキーですので、sign_upの時には何も影響しないのです。
確かに、登録時に認証って意味わからんわな(2段階認証とかを除いて)
つまり、

config/initializers/devise.rb
# donot_exist_columnは存在しないカラムです
config.authentication_keys = [:donot_exist_column]

これでも登録できます。sign_inはできませんが。。

sign_inの時は関係あり!!!

sign_upの時は使いませんが、sign_inと時は「本当にあなたですか」と聞くため使用します。
そのため、

config/initializers/devise.rb
# nameカラムで認証を行う。
# 他の要素(age, email)をsign_in入力しても認証では使用しない
config.authentication_keys = [:name]

このように書けばnameのみを使って本人認証している状況です。年齢や電話番号でも本人認証をしたければ後ろに追記します。[:name, :age, :number]のように。。

devise_parameter_sanitizer.permitは認証とは関係ない?!

config.authentication_keysは認証用でしたが、devise_parameter_sanitizer.permitは何のために使うのでしょうか。
devise_parameter_sanitizer.permitはストロングパラメータなので、form等で入力された文字を取得するときに「取っていいよ」と許可を与えます。
その許可を与えたもの(パラメータ)を認証用として使って「あなたは本人ですか」と聞きます。

devise_parameter_sanitizer.permitは設定しなくてもいい?

devise_parameter_sanitizer.permitは必ずしも自ら設定する必要はありません。deviseが自動でやってくれている部分があるので、、
config.authentication_keysに登録されたパラメータに関しては自動的に「認証でこのパラメータを使うってことはストロングパラメータに設定しておいた方がいいよね!」という感じで設定されます。(優しい!そのせいで混乱しました笑)
なので、必ずしも必要ではありません。

じゃあいつ設定するのか

devise_parameter_sanitizer.permitを設定するときの状態を例を用いて説明します。
例を挙げます。

  • ユーザーには名前とemailと電話番号を登録してほしい。
  • でもサインイン時には名前だけでいいや

認証で使うもの

  • 名前

ユーザが入力する情報 ※()はカラム名です

  • 名前(name)
  • email(email)
  • 電話番号(number)

認証で使うものはconfig.authentication_keysに設定する必要があるので設定します。

config/initializers/devise.rb
config.authentication_keys = [:name]

次に、入力する情報はストロングパラメータに設置する必要があるので設定します。

application_controller.rb
devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :number])
  • sign_upだけで良い理由は、sign_inではnameだけを使用してconfig.authentication_keysに書いてあるので不要。
  • config.authentication_keysに書いてあるものはすでにストロングパラメータになっているので、keys: [:name, :email, :number]でなくていい

=> こんな感じでdevise_parameter_sanitizer.permitは、config.authentication_keysには設定していないけど、入力として欲しいものに対して設定します。

まとめ

  • config.authentication_keys・・・認証用
  • devise_parameter_sanitizer.permi・・・ストロングパラメータ用

何気なく使うのはよくないですね、、
しっかりと区別しなければ、、

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?