2010-03-26 73 views
1

你知道,我想我必須檢查模型回調中的當前用戶(如before_update)。而不是僅僅依靠在控制器中添加where ('something.user_id = ?', 'current_user.id')。我在.NET中需要類似Thread.CurrentPrincipal
將用戶模型中的當前用戶引用是否安全?對不起,我不太瞭解它如何在引擎蓋下工作。
或者你怎麼做Rails方式?
對不起,如果這是一個愚蠢的問題。將用戶模型中的當前用戶引用到Rails是否安全?

3/27添加
糟糕
要得到正確的答案,您必須提出正確的問題。這本身並不容易。怎麼可能別人的問題如此模糊,他們得到了答案,而你自己的問題如此明確,但沒人理解呢? :)
我不明白在哪裏安全檢查。用戶只能訪問他自己的東西。在控制器級別?然後測試每一個動作? 「不應該/查看|創建|編輯|銷燬/其他用戶的東西」?我想可能是我可以把它放在模型中,並有一個地方/寫|重構|測試/。這就是爲什麼我問我如何獲得對當前用戶的引用。
其實我很驚訝我沒有在Rails指南或博客中找到任何相關的東西。除了「不這樣做」之外,有人提出了一些問題,但沒有權威的「最佳實踐」。
經過一番思考之後,我決定在控制器before_filter中創建範圍限定在當前用戶的範圍,並且僅僅依靠自己的約定(向自己承諾我不會直接訪問模型)。每個控制器只需測試一次。無論如何,這不是銀行應用程序。

回答

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_1user_2

0

我真的不明白Thread.CurrentPrincipal,但current_user通常是指登錄的用戶,這是完全控制器上下文。它不適用於模型內部。因此,一個哈克的解決辦法是:

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大師,請評論。

相關問題