これは何
Railsアップグレードガイドのこちらの内容
アップグレード時に何をすれば良い?
Railsを使っているとCSRF(クロスサイトリクエストフォージェリ)の対策のためにコントローラにprotect_from_forgeryを書く。(最近のRailsは書かなくてもデフォルトでやってくれる)
例えば、Rails4時代にprotect_from_forgery with: :null_sessionとコントローラに書いていた場合、アップグレード後もRails4時代と同じ動作にしたい場合は、prepend: trueをつけて以下のように書けばいい。
protect_from_forgery prepend: true, with: :null_session
と書けば良い。
本題とずれるが、null_sessionの部分はいくつか指定ができて、null_sessionと書くとトークンが一致しない場合はセッションを空にする、という動作。
with: :exceptionと書くと、トークンが一致しない場合例外を発生させる。
詳細
Rails4において、コントローラに以下を記載すると
1 2 |
before_action: hogehoge protect_from_forgery with: :exception |
1.CSRF対策のためのトークンチェック
2.hogehogeという処理
という処理順序になるが、
Rails5でコントローラに同様の記載をすると
1.hogehogeという処理
2.CSRF対策のためのトークンチェック
という処理順序になる。
Rails4時代のように、常に最初にCSRFトークンチェックを行いたい場合、
1 2 |
before_action: hogehoge protect_from_forgery prepend: true, with: :exception |
と書く必要がある。
まとめ
・Rails5からはコントローラ中にbefore_actionなどのコールバックが先に定義されていると、コールバックが先に実行されるようになる
・prepend: trueをつけておくと、常に最初に実行される(=rails4と同じ動き)
参考
http://kamina-dev.hatenablog.com/entry/2017/12/15/091043