2011-03-17 33 views
12

Ruby on Rails 3 kullanıyorum ve Rack ara yazılımında cookies.signed yöntemini kullanmak istiyorum. Buna ihtiyacım var çünkü application_controller.rb dosyasındaki bir before_filter dosyasını kullanmak yerine, doğrudan middleware'de bir kullanıcının kimliğini doğrulamak istiyorum. Bir kontrol olarak, bu şekilde bu yöntemi kullanmak durumundaÇerezler bir ara katman yazılımında nasıl kullanılır?

Örneğin:

cookies.signed[:user_id'] 

I

--- 
- 1 # This is the id of the current signed in user 
- a64ee3asdtjhcc7b35fcb280956be00ba27f94d48dfe4291c06db7d57577d5893 # This is the cookie salt 

olsun ama (aynı uygulamanın) bir Raf katman olarak bu kullanımı halinde yol:

request = Rack::Request.new(env) 
request.cookies.signed[:user_id'] 

alıyorum

NoMethodError 
undefined method `signed' for #<Hash:0x00000103333d40> 

Yani, bu yöntemi bir ara yazılımda kullanmak nasıl mümkün olabilir? Kullanıcı kimliğini nasıl doğrulayabilirim ki bunu doğrulayabilir miyim?


Belki, nasıl öyleyse ... Örneğin, ActionDispatch uzatmak \ dahil etmek zorunda?

cevap

17

O bunu yapmak mümkün olmalıdır gibi görünüyor: Sen bittiğini tam olarak ne hakkında daha fazla bilgi için github .../action_dispatch/middleware/cookies.rb kontrol edebilirsiniz

request = ActionDispatch::Request.new(env) 
    request.cookie_jar.signed[:user_id] #=> 1 

.

+0

Bu doğru yönde işaret ama yine de (Raylar 4.2.7 kullanarak) aynı hata kaldırdı. Sorun, "env" deki eksik uygulama sırlarıydı. İlk satırı aşağıdaki ile çalıştı: 'ActionDispatch :: Request.new (Rails.application.env_config.merge (env))'. – jeffcarbs

3

Zaten başlatılmış bir çerez kavanozu env karma dosyasında bulunur.

env['action_dispatch.cookies'].signed[:user_id] 

Yukarıdaki örnek ActionController::Base örnek bağlamında, aşağıda aramak için eşdeğerdir:

cookies.signed[:user_id] 
+2

Maalesef 'tr ['action_dispatch.cookies']' herhangi bir raf uygulaması için mevcut değildir. İstek işlemede sadece çok geç. –

İlgili konular