覆盖ActiveRecord

时间:2011-08-05 08:55:13

标签: ruby ruby-on-rails-3 activerecord

像我们所有人一样,我有一些申请。在数据库中我存储敏感数据,我想覆盖ActiveRecord(或其他地方?),总是将AND user_id = current_user语句添加到发送到数据库的所有SQL查询中(我将user_id列添加到所有表中)。我基本上想要确保用户完成的所有操作仅在他的数据上执行。

此致 Mateusz

3 个答案:

答案 0 :(得分:0)

没有办法在应用程序级别强制执行它,强制执行它的唯一方法是禁止团队使用Class.find / where / etc方法并允许仅在集合上调用它们。因此,不应该使用Task.find而应使用current_user.tasks.find等。

答案 1 :(得分:0)

您可以使用默认范围添加AbstractModel,然后从中继承所有其他模型:

class AbstractModel < ActiveRecord::Base
  self.abstract_class = true
  default_scope where(:user_id => Thread.current[:current_user])
end

class SomeModel < AbstractModel
  ...
end

我使用了Thread.current[:current_user],因为在模型中无法访问current_user。您应该在ApplicationController等的一些before_filter方法中将current_user分配给Thread.current。

答案 2 :(得分:0)

听起来你所追求的是在你的应用程序中实现多租户的策略。

您可能需要查看multitenant gem,这可以帮助您将查询与属于当前租户的数据隔离开来。

或者,您可以使用PostgreSQL架构在数据库级别强制执行此操作。 Gay Naor在实施这一策略方面有excellent talk

如果你搜索“多租户rails应用”,你会发现其他几个关于这个问题的讨论。