deviseとcancancanで会員登録と権限管理を行い、管理者だけにrails_adminを公開する
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
にアクセスし、以下の画面が出れば完了です。