我最初在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的所有查询,无论控制器是什么调用它。
答案 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