怎么从Ruby on Rails的模型中访问current_user?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我需要在Ruby on Rails应用程序中实现细致的访问控制。个人用户的权限保存在数据库表中,我认为最好让相应的资源(即模型的实例)决定是否允许某个用户读取或写入该资源。每次在控制器中做出这个决定肯定不会非常清爽。 问题是,为了做到这一点,模型需要访问当前用户,调用类似的东西。尽管如此,模型通常无法访问会话数据。 may_read?(current_user, attribute_name)

长话短说,我感觉我希望从模型中访问当前用户(即会话数据)的想法有问题。

提问于
用户回答回答于

我会说你的直觉,current_user不在模型中是正确的。

在许多情况下,在模型中使用正确的权限API时,可以使用before_filters适用于多个操作的单行处理。但是,如果事情变得越来越复杂,则可能需要实现一个单独的层(可能lib/包含更复杂的授权逻辑)以防止控制器变得臃肿,并防止模型与Web请求/响应周期紧密耦合。

用户回答回答于

虽然这个问题已经得到很多人的回答,但我只是想快速增加我的两分钱。

由于线程安全性,在用户模型中使用#current_user方法应该谨慎。

如果你记得使用Thread.current作为一种方式或者存储和检索你的值,那么在User上使用类/单例方法是很好的。但它不那么容易,因为你还必须重置Thread.current,所以下一个请求不会继承它不应该拥有的权限。

如果你在class或singleton变量中存储状态,请记住你正在无视线程安全性。

扫码关注云+社区