2014-05-09 9 views
22

Sto utilizzando Devise con Ruby on Rails.Reindirizza per accedere alla pagina se l'utente non è autenticato con Devise

Qual è il modo consigliato per reindirizzare gli utenti non autenticati alle sessioni # nuova pagina se tentano di accedere a una pagina che richiede l'autenticazione?

In questo momento viene visualizzato un errore che indica che nessuna route corrisponde a quella a cui tentano di accedere (provocando un errore 404 nella produzione).

risposta

59

Proprio semplice add questo metodo per application_controller.rb

protected 
    def authenticate_user! 
    if user_signed_in? 
     super 
    else 
     redirect_to login_path, :notice => 'if you want to add a notice' 
     ## if you want render 404 page 
     ## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false 
    end 
    end 

E si può chiamare questo metodo su before_filter un altro controller che si desidera.

esempio:

class HomesController < ApplicationController 
    before_filter :authenticate_user! 
    ## if you want spesific action for require authentication 
    ## before_filter :authenticate_user!, :only => [:action1, :action2] 
end 

non dimenticare aggiungere login_path in routes.rb

devise_scope :user do 
    match '/sign-in' => "devise/sessions#new", :as => :login 
end 

nota: Io uso sempre questo modo, quando gioco con disposizione testamentaria per la mia autenticazione app .. (rotaie 3.2 e rotaie 4.0.1)

+0

Grazie, ha funzionato. Mi sono anche reso conto di aver impostato erroneamente le mie rotte - ho inserito molti di loro in un blocco "authenticated: user", ecco perché stavo ottenendo 404 cercando di accedervi quando si è disconnessi. – Gdeglin

+0

Grazie. questo ha funzionato benissimo per me ma ha creato altri problemi.Per esempio, quando vado a modificare una registrazione utente, ottengo un errore argomento (dicendo un numero errato di argomenti: 1 per 0) e puntando alla riga 'def authenticate_user!'. Domanda pubblicata qui: [collegamento] (http://stackoverflow.com/questions/25170716/devise-ror-argument-error-when-editing-user-registration). Apprezzo l'aiuto! – orky

+0

Grazie ** GeekToL ** –

1

È necessario fare riferimento a Come procedere: How To: Redirect to a specific page when the user can not be authenticated.

Un'altra alternativa a cui riesco a pensare è la creazione di un vincolo di routing che avvolge i percorsi protetti. Faresti meglio a bastone per il modo di concepire, ma qui è un esempio:

#On your routes.rb 
constraints(Constraints::LoginRequired) do 
    get '/example' 
end 

#Somewhere like lib/constraints/login_required.rb 
module Constraints 
    class LoginRequired 
    def self.matches?(request) 
     #some devise code that checks if the user is logged in 
    end 
    end 
end 
+0

Grazie per la risposta. Quando si tratta del modo in cui ti sei collegato, fornisce solo le istruzioni per Rails 3, e alcune delle quali non si applicano a Rails 4. Anche quando si tenta di spiegare le differenze, non funziona per me. Proverò il tuo suggerimento Vincolo successivo. – Gdeglin

+0

Grazie per aver collegato la documentazione di Devise. Questa dovrebbe essere la strada da percorrere. – maxhm10

-6

Aggiungi questo codice nel tuo config/routes.rb devise_for :users e resources :users ed è possibile generare elaborare in vista.

3

Ho pensato che è possibile aggiungere: before_action: authenticate_user! per ogni controller che richiedeva l'accesso dell'utente.

Sono un principiante di Rails ma ho trovato questo nelle mie ricerche e funziona bene nella mia applicazione.

14

Si può fare proprio come GeekTol ha scritto, o semplicemente mettere

before_action :authenticate_user! 

nel controller.

In questo caso, devise utilizza l'utente authenticate_user predefinito! metodo, che reindirizzerà a "user_session_path" e utilizzerà il messaggio flash predefinito.

Non è necessario riscrivere authenticate_user! metodo, a meno che tu non voglia personalizzarlo.

+0

Risposta corretta se si utilizza Idea. Non è necessario riscrivere se non si desidera personalizzare. – ben

Problemi correlati