2011-03-17 17 views
12

Estoy usando Ruby on Rails 3 y me gustaría usar el método cookies.signed en un middleware Rack. Lo necesito porque me gustaría autenticar a un usuario directamente en el middleware que usar un before_filter en el archivo application_controller.rb.¿Cómo usar las cookies en un middleware Rack?

Por ejemplo, si uso ese método en un controlador de esta manera:

cookies.signed[:user_id'] 

llego

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

pero si uso que en un middleware Rack (de la misma aplicación) esta manera:

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

consigo

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

Entonces, ¿cómo puedo hacer posible usar ese método en un middleware? ¿Cómo puedo obtener la identificación de usuario para que pueda autenticar eso?


Tal vez tengo que incluir \ extenderse, por ejemplo, la ActionDispatch ... si es así, ¿cómo?

Respuesta

17

Parece que debería ser capaz de hacer esto:

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

Se puede extraer de .../action_dispatch/middleware/cookies.rb en github para leer más sobre exactamente lo que está pasando.

+0

Esto me señaló en la dirección correcta, pero todavía planteado la misma error (usando Rails 4.2.7). El problema era la falta de secretos de la aplicación en el 'env'. Reemplazando la primera línea con lo siguiente funcionó: 'ActionDispatch :: Request.new (Rails.application.env_config.merge (env))'. – jeffcarbs

3

Ya se encuentra un contenedor de cookies inicializado en el hash env.

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

El ejemplo anterior es equivalente a llamar a la continuación en un contexto ActionController::Base ejemplo:

cookies.signed[:user_id] 
+2

Desafortunadamente, el 'env ['action_dispatch.cookies']' no está disponible para ninguna aplicación de rack. Solo se establece muy tarde en el procesamiento de la solicitud. –

Cuestiones relacionadas