2011-02-01 14 views
14

Estoy utilizando la aplicación Devise for rails 3. Para el almacenamiento en caché de páginas, necesito configurar cookies para la información de inicio/finalización.Cómo configurar cookies al iniciar/cerrar sesión con Devise

¿Cuál es la forma más sencilla de configurar las cookies cuando se inicia sesión/salida con Devise? Leí la parte 'Cómo personalizar el controlador', pero parece que hay mucho trabajo.

Respuesta

12

En realidad, no sería demasiado difícil de extender el legado SessionsController añadir las galletas en el registro y cerrar una sesión, se podría crear un controlador similar a esto:

# app/controllers/sessions_controller.rb 
class SessionsController < Devise::SessionsController 
    # POST /resource/sign_in 
    def create 
    cookies[:sign_in] = "Sign in info you want to store" 
    super 
    end 

    # GET /resource/sign_out 
    def destroy 
    cookies[:sign_out] = "Sign out info you want to store" 
    super 
    end 
end 

Entonces habría que añadir el siguiente a su routes.rb:

devise_for :users, :controllers => { :sessions => "sessions" } 

Eso debe conseguir que la mayor parte del camino.

+0

tuve que copiar sesiones/new.html.haml. ¡Funciona! Gracias. –

+0

Puede usar la solución en http://stackoverflow.com/questions/4301249/how-to-change-the-default-path-of-view-files-in-a-rails-3-controller para usar el original puntos de vista. –

+0

Las cookies no se configuran en iframe. Después de iniciar sesión, me redirecciona en la página de inicio de sesión en la aplicación incrustada 'Ecwid'. – kpp

18

Desde Idear se basa en Warden, otra solución es utilizar devoluciones de llamada de Warden, por ejemplo, en su devise.rb:

Warden::Manager.after_set_user do |user,auth,opts| 
    auth.cookies[:signed_in] = 1 
    end 

    Warden::Manager.before_logout do |user,auth,opts| 
    auth.cookies.delete :signed_in 
    end 
+0

Una buena manera de establecer una cookie para el control signed_in. Intenté con SessionsController como se indica en la respuesta aceptada, también funcionó, pero no estaba configurando la cookie justo después de que el usuario restablece su contraseña con el método de "contraseña olvidada". ¡Funcionó como se esperaba usando devoluciones de llamada de Warden! –

+0

Esto es mucho más efectivo. Maneja situaciones tales como iniciar sesión a través de omniauth o cuando un usuario actualiza su contraseña y necesita iniciar sesión nuevamente. – ScotterC

+4

@karlrosaen ~ 'auth.cookies' ya no es compatible – Roland

3

Adaptado de @ Karl-rosaen responder a esta solución de crear una nueva inicialización o añadir a la Fin de su inicializador de.

Esto añadirá la cookie para recordar el correo electrónico si me recordará Opciones no se pone, si no se eliminará la cookie

Warden::Manager.after_authentication do |user, auth, opts| 
    if user.remember_me 
    auth.cookies[:email] = {value: user.email, expires: 2.weeks.from_now} 
    else 
    auth.cookies.delete :email 
    end 
end 
Cuestiones relacionadas