2011-02-22 13 views
6

Después de que el usuario haya iniciado sesión y haya autenticado y guardado su nombre de usuario en session [: user_name], al enviar un formulario con method = "post" (utilizando html estándar) todos los datos de la sesión se borran y el usuario regresa a la página de inicio de sesión . Esto no sucede si el método está configurado para obtener.¿Por qué el método de publicación parece borrar los datos de sesión de mis raíles?

Publica funciona cuando uso los carriles "form_tag" que genera estas líneas adicionales:

<div style="margin: 0pt; padding: 0pt; display: inline;"> 
<input type="hidden" value="✓" name="utf8"> 
<input type="hidden" value="a_bunch_of_gibberish" name="authenticity_token"> 
</div> 

Lo que está pasando?

+1

debido a que diferentes acciones se ejecutan. Debería mostrar su código de controlador – fl00r

Respuesta

9

¿Está utilizando Rails 3.0.4? Parece que podría estar relacionado con el CSRF fix.

Si necesita una solución específica para sus necesidades, puede sobrescribir #handle_unverified_request en su controlador. Ver https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/request_forgery_protection.rb.

Here's an example donde este problema fue con OmniAuth y OpenId. (Consulte la sección 'Protección CSRF en Rails 3.0.4')

+0

Estoy usando 3.0.4 y después de echar un vistazo al artículo "CSRF Protection Bypass en Ruby on Rails" creo que tiene razón: 'Hay dos cambios importantes en esta solución, el comportamiento cuando la protección CSRF falla ha cambiado y ahora se requerirá el token para todas las solicitudes que no sean GET. Después de aplicar este parche, las solicitudes CSRF no generarán errores HTTP 500, en su lugar la sesión se restablecerá. ' –

+0

Una explicación simple de cómo sobrescribir el manejo de la falsificación: http://stackoverflow.com/a/1730421/216717 –

6

Este problema también puede ocurrir si está creando su propio formulario html.

Si te vas a redireccionado sin saber por qué, que es por "protect_from_forgery" en su ApplicationController

Con el fin de permitir que su forma para publicar, agregue el código siguiente a la misma (o utilice form_tag, la explicación más abajo) :

<form ... > 
... 
<%= hidden_field_tag "authenticity_token", form_authenticity_token %> 
... 
</form> 

la razón del "form_tag" funciona es porque form_tag genera el campo oculto para ti =)

+1

Gracias ,, esto resolvió mi problema :) – Dave

+0

@Dave alegra que lo hizo! :-) – Abdo

Cuestiones relacionadas