2011-09-27 13 views
8

Diciamo che ho una pagina semplice chiamata faq.html. Voglio questa pagina sia accessibile al pubblico, in modo da applico la solita configurazione di Primavera di sicurezza:Recupera autenticazione di Primavera di sicurezza, anche sulle pagine pubbliche con filtro = "none"

<sec:intercept-url pattern="/faq.html" filters="none" /> 

Diciamo anche che, se l'utente raggiunge la pagina dopo l'autenticazione, voglio stampare "Ciao Nome Cognome" nella pagina . Per le pagine che richiedono l'autenticazione, ho semplicemente messo the result of the following nel mio ModelMap, e poi i nomi sono accessibili a mio avviso più tardi:

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

Questo non funziona per faq.html, presumibilmente perché quando si specifica filters="none", poi la chiamata a getPrincipal() restituisce null. (Questo comportamento ha un senso in quanto fa sì che la configurazione senza filtri da applicare.) Così, invece sembra che devo fare un po 'di roba Primavera di sicurezza manualmente:

public static Authentication authenticate(HttpServletRequest request, 
     HttpServletResponse response, SecurityContextRepository repo, 
     RememberMeServices rememberMeServices) { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

    // try to load a previous Authentication from the repository 
    if (auth == null) { 
     SecurityContext context = repo.loadContext(
       new HttpRequestResponseHolder(request, response)); 
     auth = context.getAuthentication(); 
    } 

    // check for remember-me token 
    if (auth == null) { 
     auth = rememberMeServices.autoLogin(request, response); 
    } 

    return auth; 
} 

c'è un modo migliore per fare questo ? Ad esempio, sembra che Spring dovrebbe fornire alcuni strumenti per agganciare le loro chiamate API tramite la configurazione originale <sec:intercept-url />.

+0

Nota che 'filters =" none "' sembra essere stato deprecato in Spring 3.1.0: http://stackoverflow.com/a/5382178/521799 –

risposta

11

Questa è la ragione per non utilizzare filters = "none" per le pagine pubbliche.

Utilizzare invece access = "permitAll" (o access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED" se non si dispone di use-expressions = "true").

+0

Rock on. Non ero a conoscenza di questa opzione. – jtoberon

Problemi correlati