2015-04-29 7 views
6

Per alcuni servizi Web, desidero disabilitare l'uso delle sessioni. Ho aggiunto create-session = "mai" alla configurazione:L'opzione di primavera create-session = "mai" viene ignorata in alcuni scenari?

<beans:bean id="http403EntryPoint" 
    class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 
<http use-expressions="true" entry-point-ref="http403EntryPoint" 
    create-session="never"> 
    <custom-filter ref="x509Filter" position="PRE_AUTH_FILTER"/> 
</http> 

Questo funziona per la maggior parte dei casi, tranne quando l'utente pre-autenticato ha un certificato client che non è registrato nella domanda, quindi il nostro AuthenticationUserDetailsService genera un Nome utenteNotFoundException. Se l'utente non ha un certificato o ha un certificato registrato, non viene creata alcuna sessione (nessuna intestazione Set-Cookie nella risposta HTTP). Nel caso descritto viene inviato un cookie. Esso (il cookie, rispettivamente, la sessione) viene valutato anche su ciascuna richiesta successiva, anche se il certificato del client viene modificato (fondamentalmente consentendo un attacco di fissazione della sessione - l'app utilizza l'autenticazione salvata invece di autenticare nuovamente ogni chiamata).

Usiamo la sicurezza Spring 3.0.5. Testato con Tomcat 6 e 7 e anche con JBoss 7.1.1.

Perché viene creata una sessione nello scenario descritto?

PS: Il problema sessione di fissaggio può essere probabilmente workarounded impostando checkForPrincipalChanges nel AbstractPreAuthenticatedProcessingFilter, ma io sono interessato alla risposta al perché una sessione viene creata a tutti.

risposta

3

il colpevole era https://jira.spring.io/browse/SEC-1476:

In caso di accesso non autorizzato il seguente metodo della classe AbstractPreAuthenticatedProcessingFilter creerebbe una sessione e memorizzare l'eccezione c'è:

protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) { 
    SecurityContextHolder.clearContext(); 

    if (logger.isDebugEnabled()) { 
     logger.debug("Cleared security context due to exception", failed); 
    } 
    request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, failed); 
} 

Nella correzione hanno cambiato l'ultima linea, hanno rimosso la chiamata getSession() in modo che l'AuthenticationException sia memorizzata nella richiesta.

Per risolvere il nostro progetto ho creato una nuova classe che estende X509AuthenticationFilter e lì ho escludeva il metodo unsuccessfulAuthentication con lo stesso contenuto, tranne ho anche tolto la getSession() chiamata.

Problemi correlati