cancancanとrails_admin

2016/01/16 | Ruby on Rails

ユーザー権限を使えるgem「cancancan」と管理画面を作れるgem「rails_admin」を使ってみたのでその備忘録です。

ruby :2.1.3
rails :4.2.1

rails_adminの設定

先日の記事「Deviseとbootstrapのインストール」でdeviseをインストールしましたので、deviseがインストールされているものとします。

# Gemfile
gem 'cancancan'
gem 'rails_admin'
を追加

$ bundle install
$ rails g rails_admin:install
$ rake db:migrate
権限を振り分けるために使うroleを作ります。
$ rails g model role name
$ rails g migration CreateJoinTableUserRole user role

$ rake db:migrate

[code lang=”rails” title=”app/models/user.rb”]
has_and_belongs_to_many :roles

def has_role?(name)
self.roles.where(name: name).length > 0
end[/code]

を追加

[code lang=”rails” title=”app/models/role.rb”]
has_and_belongs_to_many :users[/code]

を追加

rails s
でサーバーを起動し、http://localhost:3000/adminにアクセス

rails_admin画面が表示されると思いますので、左メニューのnavigationからRolesを選び、Add newから「super_admin」「admin」を追加します。その際にuserが追加できますので、それぞれユーザーを追加します。

super_adminは全ての権限を持ったユーザー、adminは指定された権限のみを使えるユーザーにこれからcancancanで設定していきます。

[code lang=”rails” title=”config/initializers/rails_admin.rb”]
config.authenticate_with do
warden.authenticate! scope: :user
end
config.current_user_method(&:current_user)[/code]

devise向けにこの行のコメントアウトを外します。

[code lang=”rails” title=”config/initializers/rails_admin.rb”]
config.authorize_with :cancan[/code]

cancancanの設定もしますので、この行のコメントアウトも外します。

cancancanの設定

Gemfileにすでにcancancanが設定済みですので、

$ rails g cancan:ability

個別の設定は

[code lang=”rails” title=”app/models/ability.rb”]
class Ability
include CanCan::Ability

def initialize(user)
user ||= User.new # guest user (not logged in)
if user.has_role?(‘admin’)
can :manage, Post
can :access, :rails_admin
can :dashboard
elsif user.has_role?(‘super_admin’)
can :manage, :all
else
cannot :manage, Post
end
end
end[/code]

このような感じでsuper_admin,admin,userの設定をします。

この設定の場合は
admin :管理画面にアクセス可能、Postに対するすべての権限
super_admin :サイト内のすべての権限
user :Postに対する権限はすべて不可
となります。

:create, :read, :update, :destroyなどや個別の権限も設定可能です。

このままだと権限を設定しただけですので、権限を設定したcontrollerに

[code lang=”rails”]
load_and_authorize_resource
[/code]

これを追加。

これで権限が反映されたものになると思います。

以上cancancanとrails_adminの設定でした。

連記事

OpenHACCP

2024/05/03 | Ruby on Rails

先日小規模な飲食店向けにHACCPに基づく衛生管理を記録し、保存できるサービス OpenHACCP をローンチしました。 現在飲食店では重要管理計画の作成、毎日の衛生管理や重要管理計...

bundle exec cap production puma:nginx_config

2024/03/26 | Ruby on Rails

cd /etc/nginx sudo mkdir sites-available これをしてから % bundle exec cap production puma:nginx_config...

Amazon Linux 2023にmysqlをインストール

2024/03/26 | Ruby on Rails

Amazon Linux 2023でmysqlのインストール方法 $ sudo yum localinstall -y https://dev.mysql.com/get/mysql80-commu...

simple_formのcollectionのselectを任意の値で並べる方法

2020/02/21 | Ruby on Rails

Railsのsimple_formでorder作成時にproduct_nameとproduct_codeを持つproductをproduct_codeで並べ替える方法です。 ちょっとハマったので...

enumで特定の値を除外する場合

2018/12/20 | Ruby on Rails

enumで選択肢が2つある場合 # models/blog.rb class Blog < ApplicationRecord   enum status: { published...