2012-06-21 7 views
7

La suya es mi application.rbRoR | Idear bucle de redireccionamiento debido cancán autorizar

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 

Esto redirigir el uso de la página de inicio de sesión si el AccessDenied es un tiro y el usuario no está conectado ("funciona muy bien"), pero una vez que haya iniciado sesión provocará un bucle de redireccionamiento si está conectado pero no autorizado por cancan, ya que la página de inicio de sesión simplemente los redireccionará al usuario de vuelta a través de la sesión [: user_return_to] = request.url.

La pregunta es: ¿cómo puedo manejar esta lógica si el usuario está conectado pero no autorizado.

+0

si utiliza el dispositivo para la autenticación puede verificar 'current_user' si el usuario está conectado o no – krichard

Respuesta

13

He añadido una pequeña condición para que esto funcione.

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