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の設定でした。