【问题标题】:Force filter on user_id对 user_id 强制过滤
【发布时间】:2019-06-13 11:24:53
【问题描述】:

我创建了一个新的 Rails 项目并添加了用于用户管理的 Devise。我还制作了“posts”和“tags”之类的表格,它们有一个“user_id”字段,因为数据是每个用户的。 现在,我可以在始终将 user_id 作为过滤器的情况下进行查询。这很好用,但恐怕有一天我会忘记过滤 user_id 并且用户可以看到其他用户的数据。 模型中有没有办法强制使用某个过滤器?

对于某些模型,例如“帖子”和“标签”,我希望始终过滤 current_user。有没有办法自动执行此操作,或者如果我忘记过滤用户可能会引发异常?

欢迎任何提示。

(我可以使用像 Apartment 这样的东西,但我现在更喜欢单个数据库/模式)

【问题讨论】:

  • 总是从用户开始。 current_user.posts.where(...) 而不是 Post.where(user_id: current_user.id, ...)
  • cancancan 之类的东西也有助于基于所有者的授权。
  • 当然还有测试。
  • accessible_by in cancancan 看起来不错。需要进行测试,但我也可以在那里犯愚蠢的错误 :-) current_user.posts.where... 是个好主意。不确定它是否适用于更复杂的查询。

标签: ruby-on-rails


【解决方案1】:

在您的参数代理方法中,您可以使用require 方法来要求user_id 字段。因此,如果您不直接使用params,就像每个人都应该的那样,您的约束将被强制执行。

另一种方法是使用before_action 过滤器,您可以在其中检查您的状况。这样,除非您有意从该过滤器中排除某个方法,否则您的检查将始终被强制执行(或将返回 422)。

对模型本身设置条件对我来说似乎是错误的:模型不应该知道访问条件是什么,因为访问控制是一个正交特性,不应该与模型纠缠在一起。

【讨论】:

  • 一些代码将有助于说明您的观点。就目前而言,我不确定我是否理解您的提议。 params 签入 before_action 与实际操作决定运行的查询无关。
  • 是的,在运行中,现在无法编写正确的代码。 params 和 before_action 是分开的方式。
  • 不打算这样做吗?我的控制器没有问题。
  • 好吧,抱歉,我没有正确回答您的问题。那么我的回答只是最后一段:在我看来,访问控制不应该信任该模型。它打破了任务的分离。
  • 因此,我相信控制器负责访问控制 - 因此我的误解。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2015-10-02
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多