2011-02-01 7 views
14

Sto utilizzando Devise per l'applicazione rails 3. Per il caching delle pagine, ho bisogno di impostare i cookie per le informazioni di accesso/uscita.Come impostare i cookie quando si effettua il login/uscita con Devise

Qual è il modo più semplice per impostare i cookie quando si verifica l'accesso/uscita con Devise? Ho letto la parte "come personalizzare il controller" ma sembra che ci sia molto lavoro.

risposta

12

In realtà non sarebbe troppo difficile per estendere la SessionsController escogitare per aggiungere i cookie il log in e log out, è possibile creare un controller simile a questo:

# 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 

Poi si dovrà aggiungere il segue al routes.rb:

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

che dovrebbe ottenere la maggior parte del tragitto.

+0

ho dovuto copiare sessioni/new.html.haml. Funziona! Grazie. –

+0

È possibile utilizzare la soluzione in http://stackoverflow.com/questions/4301249/how-to-change-the-default-path-of-view-files-in-a-rails-3-controller per utilizzare l'originale visualizzazioni. –

+0

I cookie non sono impostati in iframe. Dopo l'accesso, mi reindirizza sulla pagina di accesso nell'applicazione incorporata 'Ecwid'. – kpp

18

Dal Devise si basa su Warden, un'altra soluzione è quella di utilizzare i callback di Warden, ad esempio nel vostro 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

Bel modo di impostare un cookie per il controllo signed_in. Ho provato con SessionsController come indicato nella risposta accettata, ha funzionato anche, ma non è stato impostato il cookie subito dopo che l'utente ha reimpostato la sua password con il metodo 'password dimenticata'. Ha funzionato come previsto usando i callback di Warden! –

+0

Questo è molto più efficace. Gestisce situazioni quali l'accesso tramite omniauth o quando un utente aggiorna la propria password e deve essere nuovamente connesso. – ScotterC

+4

@karlrosaen ~ 'auth.cookies' non è più supportato – Roland

3

Adattato da @ Karl-Rosaen rispondere a questa soluzione di creare un nuovo inizializzatore o aggiungere al fine del tuo inizializzatore devise.rb.

Ciò aggiungerà il cookie per ricordare l'e-mail, se mi ricordo opzioni è impostata, se non verrà eliminato il 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 
Problemi correlati