2015-05-10 9 views
6

Ho uno scenario univoco che sto tentando di risolvere in base ai limiti del plug-in Spring Security (versione 1.2.7.3 se curata). Ho creato un plugin SSO personalizzato che consente l'accesso con un URL firmato. Il plugin personalizzato funziona alla grande, e ho aggiunto secondo la documentazione creando i bean in resources.groovy e aggiungendolo alla catena di filtri all'interno di BootStrap.groovy.Come saltare saltuariamente il filtro SecurityContextPersistenceFilter nella catena del filtro del plug-in Grails Spring Security

SpringSecurityUtils.clientRegisterFilter('ssoFilter', SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order + 10) 

Una volta che un utente è firmato in ogni cosa funziona alla grande e la sessione attiva esistente che è stato aggiunto al contesto di protezione autentica l'utente.

Ho un caso d'uso in cui è possibile che un utente che è già autenticato possa tornare sullo stesso browser (cioè lo stesso cookie di sessione) con un utente diverso su una richiesta SSO. Mi piacerebbe che la catena di filtri noti 'sso = true' nella stringa di query dell'URL.

Il comportamento che sto vedendo ora è che l'SSO non viene mai raggiunto perché l'utente originale è già autenticato dal contesto di sicurezza. Non riesco ad aggiungere il filtro SSO prima dello SecurityContextPersistenceFilter in quanto ciò causa problemi in cui il filtro SSO viene costantemente colpito e nulla viene effettivamente visualizzato. Ciò segue i documenti in cui l'ho visto dicendo che non dovresti mettere nessun filtro davanti al filtro del contesto di sicurezza.

avevo guardato nella creazione di una catena di filtri speciale specificamente per gli URL con 'sso = true' (cosa che sto facendo durante il flusso non autenticato con l'aggiunta di un costume RequestMatcher e AuthenticationEntryPoint implementazione al DelegatingAuthenticationEntryPoint) utilizzando lo springsecurity.filterChain. chainMap config dicendo. Tuttavia, dai documenti e dagli esperimenti risulta che solo il percorso è filtrato.

C'è un modo per garantire che ogni volta che 'sso = true' viene visualizzato nell'URL, che il filtro SSO venga colpito mentre è ancora disponibile la disponibilità al contesto di sicurezza o che SecurityContextPersistenceFilter possa passare attraverso la richiesta al filtro SSO ?

risposta

5

Mi sembra che sia possibile utilizzare una personalizzazione SecurityContextRepository.

Version 1.2.7.3 del plug-in Spring Security Grails sembra utilizzare Spring Security 3.0.7. Come menzionato in Section 8.3.1 of the Spring Security reference, da Spring Security 3.0 in poi, lo SecurityContextPersistenceFilter è configurato con un bean SecurityContextRepository, che è responsabile del caricamento e del salvataggio dello SecurityContext. Per impostazione predefinita, questa è un'istanza di HttpSessionSecurityContextRepository.

È possibile creare una classe personalizzata che estende HttpSessionSecurityContextRepository. La sottoclasse personalizzata potrebbe sovrascrivere il metodo loadContext (HttpRequestResponseHolder) per eliminare l'attributo di sessione "SPRING_SECURITY_CONTEXT" se la richiesta contiene il parametro di query sso=true.

È possibile visualizzare l'attuazione di HttpSessionSecurityContextRepository nella Primavera di sicurezza 3.0.7 su GitHub:
https://github.com/spring-projects/spring-security/blob/3.0.7.RELEASE/web/src/main/java/org/springframework/security/web/context/HttpSessionSecurityContextRepository.java

correlati: How can I use Spring Security without sessions?

1

Daniel, La soluzione ha funzionato. Ecco il mio snippet

@Override 
public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) { 
    logger.debug("loadContext entry"); 
    String ssoParameter = requestResponseHolder.getRequest().getParameter("sso"); 

    if (ssoParameter != null && ssoParameter.equalsIgnoreCase("true")) { 
     HttpSession session = requestResponseHolder.getRequest().getSession(false); 
     if (session != null) session.invalidate(); 
    } 
    return super.loadContext(requestResponseHolder); 
} 
Problemi correlati