おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

devise のコントローラを継承して authenticate_user! するときの注意事項

下記のようなコード。hoge アクションには authenticate_user! が効きません。

class RegistrationsController < Devise::RegistrationsController
  before_filter :authenticate_user!, only: :hoge

  def hoge; end
end

なぜか。authenticate_user! に該当する部分のコードを見てみます。

class_eval <<-METHODS, __FILE__, __LINE__ + 1
  def authenticate_#{mapping}!(opts={})
    opts[:scope] = :#{mapping}
    warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
  end
  # ...
end

devise のコントローラを継承したコントローラ中では認証が実行されないようになっているようです。なにか理由があるのだと思いますが、独自にコントローラを拡張しているとこれにハマると思います…。