2012-06-21 2 views
7

La sua è la mia application.rbRoR | Elaborare loop di reindirizzamento a causa del cancan autorizzare

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    rescue_from CanCan::AccessDenied do |exception| 
    flash[:error] = "You must first login to view this page" 
    session[:user_return_to] = request.url 
    redirect_to "https://stackoverflow.com/users/sign_in" 
    end                                     

end 

Ciò reindirizzare l'uso alla pagina di login se l'AccessDenied è un tiro e l'utente non è connesso ("funziona bene"), ma una volta effettuato l'accesso causerà un ciclo di reindirizzamento se connesso ma non autorizzato da cancan poiché la pagina di accesso li reindirizzerà nuovamente all'utente indietro tramite la sessione [: user_return_to] = request.url.

La domanda è: come gestisco questa logica se l'utente è connesso ma non autorizzato.

+0

se si utilizza inventare per l'autenticazione è possibile controllare 'current_user' se l'utente è loggato o meno – krichard

risposta

13

Ho aggiunto alcune condizioni per farlo funzionare.

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    #Redirects to login for secure resources 
    rescue_from CanCan::AccessDenied do |exception| 

     if user_signed_in? 
     flash[:error] = "Not authorized to view this page" 
     session[:user_return_to] = nil 
     redirect_to root_url 

     else    
     flash[:error] = "You must first login to view this page" 
     session[:user_return_to] = request.url 
     redirect_to "https://stackoverflow.com/users/sign_in" 
     end 

    end 
end