【Rails・devise】複数モデルを管理する際の<<before_action>>
はじめに
deviseを用いて一般の方とグループ(企業や団体等)で分けてログインを実装する上で、
ログインした人のみが閲覧できるbefore_actionの実装に手間取ってしまったので記録します!
結果から
applicationコントローラーで
・グループの方がログインした場合 → authenticate_any!が有効
・それ以外の人がログインした場合 → authenticate_user!が有効
class ApplicationController < ActionController::Base
def authenticate_any!
if group_signed_in?
true
else
authenticate_user!
end
end
end
各コントローラーで必要なところでbefore_action :authenticate_any!
を記載する
application_controller.rbに記載して全て制限したいのであれば
before_action :authenticate_any!
の下でauthenticate_any!
を定義する
before_action :authenticate_any!
無事、ログインについてのRspecも通りました!
ハマったこと
userまたはgroupがログインしている場合のみページにアクセスができるように実装したかったので、
左から順に評価し、最初に真になったものを返してくれる||を使用してみました。
before_action :authenticate_user! || :authenticate_group!
こうするとauthenticate_user!は反応するもののgroupが反応せず、
groupを作成できるもののroot_pathでCompleted 401 Unauthorized
とエラーが発生して、
弾き出されてuserのsign_inページにリダイレクトされてしまっていました。
Completed 401 Unauthorized
でググるとCSRF トークンの不整合がでてくることが多かったので、
application_controller.rbにprotect_from_forgery with: :null_session
記載をして
対応したりもしましたが、ダメでした。。。
(これはCSDF 対策として弱くなるという意見もあるみたいなので、そもそも使わないほうがいいのかも・・・)
学んだこと
before_actionで場合分けしたい場合は、メソッドを作成してその中で条件分けをする!
今までなんとなくbefore_actionを使用していましたが、勉強になりました!(かなり初歩的なのかとは思いますが笑)
同じようなことに困っている方のお役に立てたら嬉しいです。
Author And Source
この問題について(【Rails・devise】複数モデルを管理する際の<<before_action>>), 我々は、より多くの情報をここで見つけました https://qiita.com/marikoara/items/09f16c30d1f8f366a9ea著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .