根据来自其他模型的信息限制对模型的所有访问(rails)

时间:2015-11-09 21:27:41

标签: ruby-on-rails ruby postgresql

我最初在Restricting any access to a model in rails中提出了类似的问题 - 但这并没有满足我的全部需求。

我有一个包含许多条目的Dataapi模型:

create_table "dataapis", force: :cascade do |t|
  t.string   "device_id"
  t.datetime "start_time"
  t.datetime "end_time"
end

我有一个Sandbox模型,其中包含我想如何限制访问的信息(Sandbox条目在我的管理面板中定义)。

create_table "sandboxes", force: :cascade do |t|
  t.integer  "device_id"
  t.integer  "user_id"
  t.datetime "start_date"
  t.datetime "end_date"
end

实际上,我只希望用户在Sandbox中有适当的条目时才能访问dataapi,这限制了访问:   - 用户   - 开始DateTime   - 结束日期时间   - 访问发送dataapi的设备(已在前一个问题中处理过该部分)。

我似乎无法找到一种方法来执行此操作 - 模型无法访问@user,因此我无法在默认范围内检查它。有什么建议?我试过看宝石(CanCanCan,Pundit等),但他们只做基于控制器的授权。我希望此限制适用于对dataapi的所有查询,无论控制器是什么调用它。

1 个答案:

答案 0 :(得分:0)

您可能想尝试声明授权gem,它在模型级别提供授权。

https://github.com/stffn/declarative_authorization

它为您提供了一种基于用户权限过滤的查询方法......

Employee.with_permissions_to(:read).find(:all, :conditions => ...) 

另一种方法是,您可以将current_user存储在Dataapi模型中,并使用around_filter填充它。

在模型中......

class Dataapi < ActiveRecord::Base
  def self.current_user
    Thread.current[:current_user]
  end

  def self.current_user=(some_user)
    Thread.current[:current_user] = some_user
  end
end

在应用程序控制器中......

class ApplicationController < ActionController::Base
  around_filter :store_current_user

  def store_current_user
    Dataapi.current_user = User.find(session[:user_id])
    yield
  ensure
    Dataapi.current_user = nil
  end             
end

然后,您可以使用Dataapi.current_user

引用Dataapi模型中的current_user