2015-04-29 6 views
6

Für einige Webdienste möchte ich die Verwendung von Sitzungen deaktivieren. Ich fügte hinzu, create-session = „never“ auf die config:Spring-Option create-session = "nie" wird in einigen Szenarien ignoriert?

<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> 

Dies funktioniert für die meisten Fälle, mit der Ausnahme, wenn die Pre-authentifizierten Benutzer ein Client-Zertifikat hat, die in der Anwendung nicht registriert ist, so unsere AuthenticationUserDetailsService löst einen BenutzernameNotFoundException aus. Wenn der Benutzer kein Zertifikat besitzt oder ein registriertes Zertifikat besitzt, wird keine Sitzung erstellt (keine Set-Cookie-Kopfzeile in der HTTP-Antwort). Im beschriebenen Fall wird ein Cookie gesendet. Es (der Cookie bzw. die Sitzung) wird auch bei jeder folgenden Anfrage ausgewertet, selbst wenn das Client-Zertifikat geändert wird (grundsätzlich erlaubt es einen Sitzungsfixierungsangriff - die App verwendet die gespeicherte Authentifizierung, anstatt sich bei jedem Anruf erneut zu authentifizieren).

Wir verwenden Spring Sicherheit 3.0.5. Getestet mit Tomcat 6 und 7 und JBoss 7.1.1.

Warum wird in dem beschriebenen Szenario eine Sitzung erstellt?

PS: Das Session-Fixation-Problem kann wahrscheinlich durch Setzen checkForPrincipalChanges im AbstractPreAuthenticatedProcessingFilter workarounded werden, aber ich bin an der Antwort, warum eine Sitzung überhaupt entsteht.

Antwort

3

Der Täter https://jira.spring.io/browse/SEC-1476 wurde:

Bei unberechtigtem Zugriff auf die folgende Methode in der Klasse AbstractPreAuthenticatedProcessingFilter eine Sitzung erstellen würde und speichern Sie die Ausnahme dort:

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

In dem Update verändert sie die letzte Zeile haben sie den getSession() -Aufruf entfernt, so dass die AuthenticationException in der Anfrage gespeichert wird.

unser Projekt zu beheben habe ich eine neue Klasse, die X509AuthenticationFilter und erstreckt sich overrode ich die Methode unsuccessfulAuthentication mit dem gleichen Inhalt, außer ich die getSession auch entfernt() Anruf.