(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

既に認証機能が作られているアプリで後からActiveAdminを入れるときにやったこと

gregbell/active_admin · GitHub


なんとなーく、 ActiveAdmin あたりが賑やかでいいなぁと思ったので入れたかったんだけど、現在開発中のアプリでは既に認証の機能を実装してあるから*1、そのまま入れちゃうと Devise あたりと競合してしまってしんどいのでちょっとひと工夫して避けた。具体的に言うと Devise を使わないようにして、認証を自分で作ったものにしてしまう。

まず、インストール時に AdminUsers とか作ろうとするのをスキップ

rails g active_admin:install --skip-users

次に設定ファイルで config/initializers/active_admin.rb があるけど、以下のように設定を変える。

config.authentication_method = false
config.current_user_method   = false

そんでもってこのままだと単純に認証すっ飛ばして管理画面 (/admin) に入れてしまうので、それは嫌だから独自実装されている認証機能のとこに以下のような分岐を足す。

/\Aadmin\/[a-z]+\Z/ =~ params[:controller] and not user.admin?

ActiveAdmin で作られる管理画面は admin がプレフィックスとして、コントローラーにつくので正規表現でパラメタの値を検証すれば見分けることができそう。それで管理者権限のない場合はルートにリダイレクトするとかそんな感じでとりあえず良さそう。まぁやっつけだし、あんまりいい方法じゃないと思う。

認証のとこだけ、別の設定があった。 active_admin.rb に以下のような部分があった。

# == Controller Filters
#
# You can add before, after and around filters to all of your
# Active Admin resources and pages from here.
#
# config.before_filter :do_something_awesome

これで管理者用の認証メソッドを設定してやればいい。管理者ならOKで、管理者じゃなければルートにリダイレクトするとかそんな感じでいいと思う。

余談

本当は設定ファイルを書き換えるときに false ではなくて、ちゃんとメソッド名を書いたほうがいいんだろうけど、今作っているアプリだとそもそも管理者という考え方がうまく ActiveAdmin とマッチしていないからこうやるしかなかった感。

それとこれユーザーを認証させるタイプのアプリだと、普通 authorize とかメソッド作ってて before_action でそれが効いちゃって管理画面にいけないと思うんだけど、その辺普通はどうやるんだろう。実際今回はそこにひっかかったから上記のような迂回策を取ったんだけど。さてはて。

*1: Omniauth あたりで独自実装