今日は、権限を定義するところ。あとでカスタマイズする前提で、まずはcancanの権限設定用クラスであるAbilityクラスを作ることにする。
目次
前提
ActiveAdminにCanCanを使った権限機能を追加する(1) - sessanの日記
が実施済みであること。
作業の流れ
- cancanのAbilityクラスを生成する
- cancanのAbilityクラスに権限の設定をする
- AdminUserクラスに権限の保有をチェックするメソッドを追加する
1. cancanのAbilityクラスを生成する
まずはcancanのジェネレータを使って、テンプレートを生成する
> rails g cancan:ability
2. cancanのAbilityクラスに権限の設定をする
こんな感じでロールの継承を定義する。admin_rolesはadmin_roles_assignテーブルにデータが入っていないと空になります。
ActiveAdminにゲストはいらないと思うが念のため。
ロールの継承の定義は、それぞれのメソッドで定義します。
AdminUser#admin_rolesというメソッドがある前提ですが、これは、ActiveAdminにCanCanを使った権限機能を追加する(1) - sessanの日記で設定済です。
managerロールは、Hogeクラスだけをmanageでき、adminロールは、managerクラスの権限プラスMogeクラスをmanageできるという設定例です。
admin_rolesテーブルに、manager、adminというnameのロールが定義されている前提です。
class Ability include CanCan::Ability def initialize(admin_user) admin_user || AdminUser.new # for guest admin_user.admin_roles.each { |role| send(role.name.downcase) } if admin_user.admin_roles.size == 0 can :read, :all #for guest without roles end end def manager can :manage, Hoge end def admin manager can :manage, Moge end end
3. AdminUserクラスに権限の保有をチェックするメソッドを追加する
#in models/admin_user.rb def has_role?(admin_role_sym) admin_roles.any? { |r| r.name.underscore.downcase.to_sym == admin_role_sym } end