2011-12-06 11 views
7

Estoy tratando de hacer esto: Make spring security add the return to url in the query string for the login page, es decir: get spring para indicar la página de inicio de sesión de donde vengo. Tengo alguna integración de SSO ... así que les enviaré la url, o agregarán el referer por mí, así que sé que el usuario debe haber iniciado sesión y enviado al /some/url. Eso es genial. El problema que estoy teniendo es ampliar LoginUrlAuthenticationEntryPoint (a menos que pueda decirme una buena razón para implementar AuthenticationEntryPoint en su lugar). Necesito sólo para modificar las solicitudes a la página de inicio de sesión, así:cómo extender LoginUrlAuthenticationEntryPoint o cómo implementar AuthenticationEntryPoint

RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); 

// only append returnto to '/login' urls 
if(request.getServletPath() == "/login") { 
    // indicates we want to return to this page after login 
    redirectStrategy.sendRedirect(request, response, "/login?returnto=" + request.getServletPath()); 
} 

¿Cómo puedo dejar que el resto de las peticiones de hacer su cosa? Esto es incorrecto (lo que estaba haciendo):

RequestDispatcher dispatcher = request.getRequestDispatcher("/login"); 

// just forward the request 
dispatcher.forward(request, response); 

porque nos pone en un bucle de redirección. Sin embargo, parece ser what spring does in its version of commence. Estoy confundido. ¿Qué se supone que debo hacer con commence en mi extensión personalizada al LoginUrlAuthenticationEntryPoint?

Respuesta

6

Lo descubrí. Solo era necesario reenviar a la página de inicio de sesión con 'returnto' adjunto. Me pareció confuso al principio porque LoginUrlAuthenticationEntryPoint no significaba 'esto redirige a los usuarios a la página de inicio de sesión' a primera vista. Esto es todo lo que necesitaba:

@Override 
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException { 
    RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); 

    redirectStrategy.sendRedirect(request, response, "/login?returnto=" + request.getServletPath()); 
} 

Esto era útil: Código LoginUrlAuthenticationEntryPoint.java on grepcode.com

0

de Josh era exactamente lo que necesitaba para detectar errores de autenticación AJAX en JavaScript, al mismo tiempo conservar la lógica de redireccionamiento de entrada por defecto para todas las demás solicitudes. Como todas mis solicitudes AJAX comienzan con "/ rest", pude filtrar esto.

if(request.getRequestURI().contains("/rest/")) 
    response.sendError(403); 
else 
    new DefaultRedirectStrategy().sendRedirect(request, response, "/login"); 
Cuestiones relacionadas