2011-12-06 12 views
7

Sto provando a fare questo: Make spring security add the return to url in the query string for the login page, ovvero: prendi molla per dire alla pagina di accesso da dove vengo. Ho un po 'di integrazione SSO .. quindi gli invierò l'url, o aggiungeranno il referer per me, quindi so che l'utente deve essere loggato e inviato a /some/url. È tutto dandy. Il problema che sto riscontrando è estendere LoginUrlAuthenticationEntryPoint (a meno che tu non possa dirmi una buona ragione per implementare invece AuthenticationEntryPoint). Ho bisogno di modificare solo le richieste alla pagina di login, in questo modo:come estendere LoginUrlAuthenticationEntryPoint o come implementare 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()); 
} 

Come posso lasciare che il resto delle richieste fare le loro cose? Questo non è corretto (quello che stavo facendo):

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

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

perché ci mette in un ciclo di reindirizzamento. Tuttavia sembra essere what spring does in its version of commence. Non ho capito bene. Cosa dovrei fare con lo commence nella mia estensione personalizzata su LoginUrlAuthenticationEntryPoint?

risposta

6

Capito. Dovevo solo inoltrare alla pagina di accesso con "returnto" aggiunto. All'inizio ho trovato confuso perché lo LoginUrlAuthenticationEntryPoint non significava "questo reindirizza gli utenti alla pagina di accesso" a prima vista. Questo è tutto quello che dovevo:

@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()); 
} 

questo è stato utile: il codice LoginUrlAuthenticationEntryPoint.java on grepcode.com

0

di Josh era esattamente quello che mi serviva per catturare gli errori di autenticazione AJAX in JavaScript, pur conservando la logica di reindirizzamento di accesso di default per tutte le altre richieste. Poiché tutte le mie richieste AJAX iniziano con "/ rest", sono stato in grado di filtrare su questo.

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