あすたぴのブログ

astap(あすたぴ)のブログ

Deviseに独自のstrategyを入れる

結論

deviseのデフォルトに沿わない場合は、deviseはいらない。

結局 ほぼwardenだけの話

config/initializers/devise.rb

require 'devise/strategies/media_authenticatable'
~~~
  config.warden do |manager|
    manager.default_strategies(scope: :user).unshift :user_authenticatable
    manager.strategies.add(:user_authenticatable,
                           Devise::Strategies::UserAuthenticatable)
  end

app/models/devise/strategies/user_authenticatable.rb

require 'devise/strategies/authenticatable'
module Devise
  module Strategies
    class MediaAuthenticatable < Authenticatable
      def authenticate!
      # 認証ロジックをかく
      end

      def valid?
      # 認証をする条件を書く
      end
    end
  end
end

これだけかな。

残念なところ

Devise.add_moduleの流儀に従って、モジュールを追加し、strategyだけを追加したくても、モデルが必須だったり(空実装でも定義だけ必要になる)、 DeviseControllerを継承したコントローラーを作ろうとして、routingをadd_moduleから設定しようとした場合、ルーティングを設定するメソッドの実装がActionDispatch::Routingを拡張して書く必要があったり。

まとめ

なんか、そこまでがんばり必要がなさすぎるな。と。 moduleは自分で拡張するものではないんだろうな。

wardenに直接追加するんだったら deviseとは?となる。 もやもやするライブラリだ。