【问题标题】:How to authorise action in a controller using CanCan ability?如何使用 CanCan 功能授权控制器中的操作?
【发布时间】:2016-03-08 10:32:59
【问题描述】:

我在我的 Rails 项目中使用CanCan 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

我有另一个控制器controllers/admin/users_controller.rb,看起来像:

class Admin::UsersController < AdminController

  load_and_authorize_resource

  respond_to :html, :json

  def index
  end

  def new
  end
end

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

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

【问题讨论】:

  • 什么是rails版本? rails -v
  • 当你有user对象时,你怎么知道用户是partneradmin?我有user.is_partneradmin? 方法吗?它是数据库中的布尔字段吗?
  • @MattGibson 是的,我有 is_partner_admin? 方法来检查。
  • Cancan gem 适用于我记得的 rails 3。你应该使用Cancancan,它真的很容易使用,而且比Cancan更好。
  • @Fresz 我已经在使用 'cancancan', '~> 1.8.4'

标签: ruby-on-rails ruby authorization cancan


【解决方案1】:

我必须添加 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

然后在控制器中添加authorize_resource :class =&gt; AdminController

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多