【问题标题】:ActiveAdmin, CanCan: privelegiesActiveAdmin,CanCan:特权
【发布时间】:2014-08-07 18:53:37
【问题描述】:

我正在尝试在我的应用中为 active_admin 管理员设置权限。我想将拥有完整权限的管理员和无法在 ActiveAdmin 管理面板中编辑和销毁对象的版主分开。

ability.rb:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= AdminUser.new

    case user.role
    when 'admin'
      can :manage, :all
    when 'moderator'
      cannot [:destroy, :edit], :all
    end
  end
end

admin_user.rb

ActiveAdmin.register AdminUser do

  permit_params :email, :password, :password_confirmation, :role

  index do
    selectable_column
    id_column
    column :email
    column :role
    column :current_sign_in_at
    column :sign_in_count
    column :created_at
    actions
  end

  filter :email
  filter :current_sign_in_at
  filter :sign_in_count
  filter :created_at

  form do |f|
    f.inputs "Admin Details" do
      f.input :email
      f.input :password
      f.input :password_confirmation
      f.input :role, as: :radio, collection: { 'Administrator' => 'admin', 'Moderator' => 'moderator' }
    end
    f.actions
  end

end

问题是具有版主角色的管理员仍然可以编辑和销毁对象。我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activeadmin cancan


    【解决方案1】:

    @railsdevmtl,ActiveAdmin 有自己定义的操作,因此无需在控制器中覆盖它们(在这种特殊情况下)。

    回答这个问题:为了确保以某种方式检查该能力,我会推荐一些不同的方法: 首先定义Ability类方法如下:

      def initialize(admin_or_moderator_user)
        if admin_or_moderator_user.kind_of?(AdminUser)
          admin_user_rules(admin_or_moderator_user)
        else
          moderator_rules(admin_or_moderator_user)
        end
      end
    
      def admin_user_rules(admin_user)
       can :manage, :all
      end
      def moderator_rules(moderator)
       cannot [:destroy, :edit] *modelname* # what is the point of restricting these actions - you only want to leave moderator with :update? so it is easier to define as can :update, *modelname*, *params*
      end
    

    还有什么是非常重要的——在ApplicationController 中定义current_ability 方法:

      def current_ability
        @current_ability ||= case
        when current_admin_user
          Ability.new(current_admin_user) #provided as default method by active_admin
        when current_moderator
          Ability.new(current_developer) # probably you'll need to define it, but this must not be difficult
        end
      end
    

    【讨论】:

    • 据我了解,您建议将UserAdminUser 模型的角色分开。但我只需要为AdminUser 分开两个角色
    • 哦,我的错。我认为这个问题隐藏在cannot [:destroy, :edit], :all 行中。而不是:all,您很可能必须定义您限制操作的模型。 (如果有多个模型 - 在单独的行中定义它们)
    【解决方案2】:

    您的控制器上是否有以下内容用于销毁和更新操作?

    def destroy
      @foo = Foo.find(params[:id])
      authorize! :destroy, @foo
    end
    
    def update
      @foo = Foo.find(params[:id])
      authorize! :update, @foo
    end
    

    并根据您的意见进行编辑,例如:

    <% if can? :update, @foo %>
      <%= link_to "Edit", edit_foo_path(@foo) %>
    <% end %>
    

    您可以通过:destroy 操作遵循类似的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多