2015-04-29 11 views
6

Dla niektórych usług internetowych chcę wyłączyć korzystanie z sesji. Dodałem Create-session = „nigdy” do config:Opcja Spring create-session = "never" jest ignorowana w niektórych scenariuszach?

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

Działa to w większości przypadków, z wyjątkiem gdy wstępnie uwierzytelniony użytkownik ma certyfikatu klienta, który nie jest zarejestrowany w aplikacji, więc nasz UwierzytelnianieUserDetailsService wyrzuca UsernameNotFoundException. Jeśli użytkownik nie ma certyfikatu lub ma zarejestrowany certyfikat, sesja nie jest tworzona (w odpowiedzi HTTP nie ma nagłówka Set-Cookie). W opisanym przypadku wysyłany jest plik cookie. To (plik cookie lub sesja) jest także oceniany na każde następne żądanie, nawet jeśli certyfikat klienta został zmieniony (zasadniczo umożliwiając atak naprawy sesji - aplikacja używa zapisanego uwierzytelnienia zamiast ponownego uwierzytelniania przy każdym połączeniu).

Używamy zabezpieczeń Spring 3.0.5. Testowane z Tomcat 6 i 7 oraz JBoss 7.1.1.

Dlaczego sesja została utworzona w opisanym scenariuszu?

PS: Problem utrwalenie sesja może być prawdopodobnie workarounded ustawiając checkForPrincipalChanges w AbstractPreAuthenticatedProcessingFilter, ale jestem zainteresowany odpowiedzią dlaczego sesja jest tworzony w ogóle.

Odpowiedz

3

Sprawca został https://jira.spring.io/browse/SEC-1476:

W przypadku nieautoryzowanego dostępu następująca metoda w klasie AbstractPreAuthenticatedProcessingFilter by stworzyć sesję i przechowywać wyjątek tam:

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

W fix zmienili ostatni , usunęli wywołanie getSession(), aby wyjątek AuthenticationException był zapisany w żądaniu.

Aby rozwiązać nasz projekt I stworzył nową klasę, która rozciąga X509AuthenticationFilter i tam overrode metodę unsuccessfulAuthentication z samej treści z wyjątkiem ja też usunęła getSession() połączeń.

Powiązane problemy