TechBox

スタートアップで働くRails&機械学習エンジニアのブログ。時々GT-Rと旅行。

deviseとcancancanで会員登録と権限管理を行い、管理者だけにrails_adminを公開する

f:id:daisuke-jp:20160927101140p:plain

Railsで手早くユーザー管理と権限設定を行いたい時に、deviseとcancancanを、 phpadmin的な、管理者がデータを直接確認出来るような仕組みを取り入れたい時にはrails_adminが便利です。

解説

  • devise ユーザー管理(メールを送ったり、パスワードのリマインドなども可能)
    ⇒どこのサイトでもよくある、メールアドレスで登録して、確認メールが来てっていう一連の動作がこのgemだけで作れる。
  • cancancan 権限管理(モデル毎のアクセス権も細かく設定出来る)
    ⇒deviseで作ったユーザーに権限を与えて、例えば管理者は全ての機能を使えるけど、ユーザーは全ての機能のEditしかできないって事も可能。
    indexではmodelとuserの関連付けを見て、勝手に自分に閲覧権限がある物のみを表示するっていうメッチャ便利な動きもしてくれる。
  • rails_admin 管理者のデータ管理機能

手順

gemのインストール

まずは必要なgemを記述して、インストールしていきます。

gem 'devise'
gem 'cancancan'
gem 'rails_admin'
bundle install

deviseのセットアップ

次にdeviseのセットアップをします。

rails g devise:install
rails g devise user
rake db:migrate

これでdeviseはインストールされつつ、userというモデルが作られます。 2行目でしているuserですが、このモデルとテーブルがdeviseで登録されたユーザーを管理する物になります。 別にadminでもcustomerでも何でも構いません。 今回は触れませんが、ユーザー登録画面を分けて、adminモデルとuserモデルを作るという事も可能です。

次に、取り急ぎ管理者ユーザーを追加します。 http://<host>:3000/users/sign_upにアクセスして、メールアドレス等入力して登録して下さい。

cancancanのセットアップ

rails g cancan:ability

rails_adminのセットアップ

rails g rails_admin:install

※installを行った際、パスを聞かれます。今回はデフォルトの/adminで表示させますので、そのままEnterで進みます。

次に、rails_admin.rbに以下の設定をして下さい。 コメントアウトされている物を、有効にするだけです。

  # == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :user
  end
    config.current_user_method(&:current_user)

  # == Cancan ==
  config.authorize_with :cancan

adminの判定を追加

rails_adminを管理者ユーザーのみに限定する設定を入れていきます。 まずは、userテーブルにadmin_flgを追加し、このフラグがtrueのユーザーのみ管理者として扱います。

rails g migration AddAdminFlgToUser admin_flg:boolean
rake db:migrate

次に先ほど登録したユーザーを管理者に設定します。

rails c
> user = User.find(1)
> user.update_attribute(:admin_flg, true)

最後にcancancanの権限設定をします。 ability.rbに設定して下さい。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user && user.admin_flg?
      can :access, :rails_admin
      can :manage, :all
    end
  end
end

cancancanの詳細はまた別途記載しますが、上記の条件の解説をすると、 ログイン済みで、admin_flgがtrueのユーザーは、全てのモデルのCRUDが行えて(can :manage, :all)、rails_adminにアクセス権限(can :access, :rails_admin)があるという感じです。

rails_adminの確認

admin_flgがtrueのユーザーにてログイン後、http://<host>:3000/adminにアクセスし、以下の画面が出れば完了です。

f:id:daisuke-jp:20160812174702p:plain