【问题标题】:Intercept ActiveRecord establish_connection initialization process拦截ActiveRecord建立连接初始化过程
【发布时间】:2010-11-18 14:37:14
【问题描述】:

我使用 Postgresql 作为我的数据库,使用 rails 3 作为多租户应用程序的中间件。

我想为通过建立连接方法创建的每个连接设置一个环境变量,其中包含当前登录的客户端 ID。

无论如何我可以通过建立连接的任何回调来拦截初始化过程来设置这个环境变量吗?

【问题讨论】:

  • 您能描述一下您真正想要实现的目标吗?如果一个应用程序连接到许多不同的数据库怎么办,你想在 env 变量中设置什么?还有为什么要设置环境变量???
  • 对不起,我的邮箱不知怎么没有收到您的评论。是的,我认为设置环境变量是一种不好的做法。基本上,我正在为每个客户帐户构建一个 postgres 模式,以确保数据隐私。但是,这意味着我需要根据当前用户的 client_id 更改每个 ActiveRecord 连接的 schema_search_path。通常我不想在模型中使用会话信息,但在这种情况下,每次建立连接时我都需要使用此信息。有没有干净的方法来做到这一点?

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

我倾向于通过 authority_level 字段之类的方式在应用程序级别分离数据。然后,您可以将“verify_permission(current_user)”方法作为 before_filter 运行。

我们通常会这样做并有一个“kick_user_out”方法,该方法会自动强制注销并使用非敏感参数通过电子邮件发送管理员警报,以便在发生权限升级时提醒管理员。你得到足够的这些,帐户也会被锁定。

【讨论】:

  • 感谢您的回答。我仍然觉得在数据库级别分离客户端数据更舒服。将其保持在客户端级别意味着我的每个查询都需要一个 client_id 过滤器。任何恶意查询都可能危及安全。我更担心这种流氓查询而不是权限级别问题。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多