你知道,我想我必须检查模型回调中的当前用户(如before_update
)。而不是仅仅依靠在控制器中添加where ('something.user_id = ?', 'current_user.id')
。我在.NET中需要像Thread.CurrentPrincipal
这样的东西
在用户模型中引用当前用户是否安全?对不起,我真的不明白它是如何在引擎盖下工作的。
或者你是如何做到的Rails方式?
对不起,如果这是一个愚蠢的问题。
添加于3/27
哎呀
要得到正确答案,您必须提出正确的问题。这本身并不是一件容易的事。怎么可能其他人的问题如此模糊,他们得到答案,你自己的问题是如此明确,但没有人理解它? :)
我不明白在哪里进行安全检查。用户只能访问他自己的东西。在控制器级别?然后测试每一个动作? “不应该/查看|创建|编辑|破坏/其他用户的东西”?我想可能是我可以把它放在模型中并有一个地方/ write | refactor | test /。这就是我询问如何获得当前用户参考的原因
实际上我很惊讶我没有在Rails指南或博客中找到任何相关内容。有些问题被问到,但除了“不要做”之外,没有权威的“最佳实践”
在给出一些想法后,我决定只在控制器中创建before_filter,将作用域限定为当前用户,并依赖于我自己的约定(向我自己承诺我不会直接访问模型)。并且每个控制器只测试一次。无论如何,这不是银行应用程序。
答案 0 :(得分:1)
我不确定我是否了解你的情况。如果你想检查一些其他模型的实例是否属于当前用户 - 使用关联(我推断出来自“something.user_id =?”)。
否则 - 在每个实例的基础上使用ActiveRecord before_update
方法。即您将当前实例作为参数传递给该回调。因此:
def before_update(current_user_instance)
current_user_instance.do_something
end
将在回调中将任何用户实例生成为current_user_instance
。所以你可以这样做:
>> user_1 = User.find(1)
>> user_1.update_attribute(:some_attribute, 'some value')
>> user_2 = User.find(2)
>> user_2.update_attribute(:some_attribute, 'some other value')
这将在不同的实例(do_something
和user_1
)上调用user_2
方法
答案 1 :(得分:0)
我真的不理解Thread.CurrentPrincipal
,但current_user
通常表示登录用户,而且完全是控制器上下文。它不能在模型中使用。所以一个hacky解决方案将是:
class UseCase < ActiveRecord::Base
after_save :my_callback_method
attr_accessor :current_user
def my_callback_method
# Some operations based on current_user
end
# ...
end
然后在你的控制器中:
#...
use_case = UseCase.find(use_case_id) # Just an example, can be anything
use_case.current_user = current_user
# then this
use_case.save
# or basically
use_case.method_that_triggers_after_save_callback
#...
警告:我确定这是糟糕的练习(我自己从未使用过)。但这会奏效。那里有Ruby大师/ MVC专家,请发表评论。