CanCan:在没有模型的情况下加载和授权控制器中的某些资源

时间:2016-09-21 09:27:55

标签: ruby-on-rails multi-tenant cancan cancancan

我没有模特的控制器。在此控制器中,我们正在加载一些其他资源。最重要的是,该应用程序具有多租户功能。

以下是代码:

# ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.owner?
      can :manage, Tool, tenant_id: user.tenant.id
    end
  end
end

# boxes_controller.rb
class BoxesController < ApplicationController
  authorize_resource class: false

  def index
    tools = Tool.all
  end
end

有什么问题?:

说,user1 tenant1创建tool1user2 tenant2创建tool2

问题是,tenant1user1可以访问tool2! :(

我写错了吗?请帮忙。

2 个答案:

答案 0 :(得分:0)

试试这个

if user.owner?
  can :manage, Tool do |tools|
    tools.tenant_id == user.tenant.id
  end
end

并在控制器中

authorize_resource class: false

希望有所帮助!

答案 1 :(得分:0)

我的习惯是“不要完全阅读宝石的文档”。我在这里找到了解决方案:https://github.com/ryanb/cancan/wiki/Fetching-Records

# ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.owner?
      can :manage, Tool, tenant_id: user.tenant.id
    end
  end
end

# boxes_controller.rb
class BoxesController < ApplicationController
  authorize_resource class: false
  before_action :set_tool, only: %i(edit update destroy)

  def index
    tools = Tool.accessible_by(current_ability)
  end

  private

  def set_tool
    @tool = Tool.find params[:id]
    authorize! :manage, @tool
  end
end

也许这对某人有帮助。谢谢!