如何使用 CanCan 功能授权控制器中的操作?

Eki*_*bal 5 ruby authorization ruby-on-rails cancan

CanCan在 Rails 项目中使用 gem 进行授权。

ability.rb文件看起来像:

class Ability
  include CanCan::Ability

  def initialize(user)
    @user = user || User.new
    send @user.role.name.underscore unless @user.role.nil?
  end

  private

  def partneradmin
    can :manage,  :all
    cannot :access, User, role_id: @user.role.id
    cannot :manage, Watchlist
    can :manage, Attachment
  end

end
Run Code Online (Sandbox Code Playgroud)

我有另一个控制器controllers/admin/users_controller.rb,如下所示:

class Admin::UsersController < AdminController

  load_and_authorize_resource

  respond_to :html, :json

  def index
  end

  def new
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我想限制对Admin::UsersController#index操作的访问,以便partneradmin用户无法访问该操作。我尝试添加cannot :access, Admin::UsersController但没有成功,因为我仍然可以访问Admin::UsersController#index页面。

请注意,我不想限制对所有用户资源的访问。例如,我有PartnerAdmin::UsersController#index并且我不想限制它,但仅限于Admin::UsersController#index(基于控制器而不是模型)。

Eki*_*bal 3

我必须添加cannot :index, AdminController这样ability.rb看起来:

  def partneradmin
     can :manage,  :all
     cannot :access, User, role_id: @user.role.id
     cannot :manage, Watchlist
     can :manage, Attachment 
     cannot :index, AdminController
   end
Run Code Online (Sandbox Code Playgroud)

然后添加authorize_resource :class => AdminController到控制器中。