Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
125
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Organization

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

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

解説

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

手順

gemのインストール

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

Gemfile
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に以下の設定をして下さい。
コメントアウトされている物を、有効にするだけです。

config/initializers/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に設定して下さい。

app/models/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にアクセスし、以下の画面が出れば完了です。
SnapCrab_NoName_2016-8-12_17-46-36_No-00.png

最後に

Railsのコーディングを行っていくと、エディターで悩む事もあると思います。
私は最初はATOMを使い、今はRubyMineを使っています。
RubyMine導入してみようと思う方、良かったら以下サイトも見てみて下さい。
RubyMine導入方法

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
125
Help us understand the problem. What are the problem?