我可以安全地告诉Rails记住昂贵的实例方法的结果吗?

问题描述 投票:0回答:1

我的current_user具有has_privilege?方法,该方法调用数据库以检查该用户是否具有一定的管理员特权或取代该管理员的特权(系统类似于Wordpress特权)。当has_privilege?每页被调用多次时,我可以使用How can I save the value of an instance method?所述的方法告诉Rails只要实例存在就记住结果,还是会使应用程序不安全?将此信息放入会话变量或缓存中是个坏主意,对吧?

ruby-on-rails security ruby-on-rails-5
1个回答
0
投票
只要实例存在
取决于您的意思。

Rails在一个单独的进程中处理每个HTTP请求,因此您可以为当前请求缓存has_privilege?方法的输出(因此多次调用该方法只会在第一次查询数据库),但是在下一个请求时,它将再次执行然后缓存(实际上,您希望这样做,因为您可以更改权限并且不希望用户保留旧的权限)。

为了这样做,您可以使用此简单技巧:

class User < ActiveRecord def has_privilege? @has_privilege ||= begin # You code here. The returned value will be cached in @has_privilege. end end end

因此,第一次调用该方法时,对于您的用户实例,@has_privilegenil,因此||将位于其右侧,即= begin ... end。除非代码返回nil,否则该值将分配给@has_privilege

在下一个呼叫中,@has_privilege不再是nil,因此||将不会触发其右侧部分并立即返回。

我需要一个交叉请求缓存

在这种情况下,您必须使用JWT并将值保存在令牌中。JWT是服务器生成并签名的令牌,必须将其发送回每个请求,否则服务器将拒绝它。

由于只有服务器可以对令牌进行签名,在用户尝试更改令牌的情况下,服务器将拒绝并注销用户。

您可以在他们的网站上阅读更多信息,使用非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.