Session-Management in Spring Security

Ich bin neu in Spring Security. Ich habe eine Anforderung zu tun, eine URL-basierte Authentifizierung, wobei ein Benutzer muss authentifiziert werden, basierend auf einer eindeutigen Referenz, der gesendet wird, jedes mal als parameter in der URL. Ich werde das weitergeben dieser Verweis auf einen webservice, erhalten die benötigten Daten und die Authentifizierung des Benutzers (und legen Sie die Rollen). Der Authentication & Autorisation Teil ist in Ordnung.

Jedoch, wenn ich versuche, rufen Sie die Anwendung erneut (nun mit einer anderen Referenz, in der URL), heißt es "SecurityContextHolder nicht aufgefüllt mit anonymen token, da es bereits enthalten ist ..." und er zeigte die details der Anfrage. Ich habe versucht, löschen des security-Kontext mit
SecurityContextHolder.getContext().setAuthentication(null) und SecurityContextHolder.clearContext().

Danach war ich in der Lage, den Zugriff auf die Anwendung mehrere Male. Allerdings, wenn ich versuche, um die Anwendung zugreifen, die gleichzeitig von meinen Kolleginnen und Kollegen, die Maschine, bekomme ich eine leere Seite. Bei der Kontrolle der logs, sehe ich eine Meldung "SecurityContextHolder nicht aufgefüllt mit anonymen token ...". Ich habe auch versucht die Einrichtung den Sitzungen, aber ich bin ratlos, wo ich bin verlieren die Spur.

Unten ist meine web.xml (nur Frühjahr-Sicherheit-Teil):

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>
          org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<listener>
    <listener-class>
          org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

<session-config>
<session-timeout>30</session-timeout>
</session-config>

spring-security.xml:

<http use-expressions="true" auto-config="false" entry-point-                   
                            ref="http403ForbiddenEntryPoint">
<intercept-url pattern="/paymentPortalInternal.*" access="hasRole('Internal')"/>
<intercept-url pattern="/paymentPortalExternal.*" access="hasRole('External')"/>

<custom-filter position="PRE_AUTH_FILTER" ref="customAuthenticationFilter"/>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="http403ForbiddenEntryPoint"
  class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<beans:bean id="customAuthenticationFilter"
  class="com.xxx.xxx.xxxxx.security.CustomAuthenticationFilter">
      <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" 
              class="org.springframework.security.web.authentication.session.
                                               ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
<beans:property name="exceptionIfMaximumExceeded" value="true" />
</beans:bean>

<beans:bean id="sessionRegistry"    
class="org.springframework.security.core.session.SessionRegistryImpl" />

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="preauthAuthProvider" />
</authentication-manager>

<beans:bean id="preauthAuthProvider" 
                class="org.springframework.security.web.authentication.preauth.
                                       PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
    <beans:bean class="com.XXX.XXXX.XXX.UserServiceImpl" />
    </beans:property>
</beans:bean>

Bitte lassen Sie mich wissen, wenn ich Bedarf an mehr Informationen.

BEARBEITEN: Hinzufügen von Protokollen.

Für die erste Anfrage:

2013-02-07 17:27:38,834 DEBUG [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(127)] - Keine HttpSession derzeit vorhanden ist
2013-02-07 17:27:38,834 DEBUG [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.loadContext(85)] - Kein SecurityContext gab es von der HttpSession: null. Wird ein neuer erstellt werden.

Für die zweite Anfrage(Bitte beachten Sie, dass die Angaben im Sicherheits-Kontext sind die von der ersten Anfrage):

2013-02-07 17:27:54,272 DEBUG [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(158)] - Erhalten, eine gültige SecurityContext von SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@1017293c: - Authentifizierung: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@1017293c: AUFTRAGGEBER: org.springframework.security.core.userdetails.User@35cd3811: Benutzername: Intern@5581e6e1-7e61-41bb-9257-b3c1acb96519; Passwort: [GESCHÜTZT]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Gewährt Behörden: Intern; Referenzen: [GESCHÜTZT]; Authentifiziert: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffc434: RemoteIpAddress: 10.188.182.107; SessionId: null; Gewährt Behörden: Internal'

Mein Verständnis ist, dass Sicherheits-Kontext-Inhaber speichert die Daten aller Nutzer. Aber in diesem Fall bin ich nicht in der Lage zu starten der Anwendung von einem anderen tab/browser.

Es klingt wie Sie Ihre benutzerdefinierten Authentifizierung-filter ignoriert die änderung der URL-parameter, vielleicht, weil der Benutzer bereits authentifiziert ist. Auch sollten Sie wahrscheinlich entfernen Sie alle gleichzeitigen Sitzung Zeug, bis Sie basics richtig funktioniert.
Vielen Dank für Ihre Antwort Luke. Das problem hier ist, wenn die zweite Anforderung wird ausgelöst, meine customAuthenticationFilter nicht immer ausgelöst, an alle. Bitte finden Sie in der trace-log habe ich auf die Frage.
Nur um einen Punkt mehr hier.. Wir haben nicht die richtigen login-Mechanismus. Alles, was wir haben ist ein einmalige Referenz, die von der URL. Also ideal, wenn eine zweite Anfrage kommt, ist es so gut wie bei einem neuen Benutzer, der versucht, authentifiziert. Aber der Sicherheitskontext ist bereits aufgefüllt, mit das token von dem ersten Benutzer, und ich bin ratlos im moment. Ich bin jetzt versucht, sich die SecurityContextPersistenceFilter filter. Bin ich in die richtige Richtung gehen?
Wenn Sie eine Verbindung in der gleichen Sitzung, dann ist es keine überraschung, dass der Sicherheitskontext enthält bereits die Vorherige Authentifizierung. Solltest du wirklich post die Umrisse Ihres CustomAuthenticationFilter. Sie sagen, es ist nicht "ausgelöst". Haben Sie ausgetestet, es heraus zu finden, warum? Es ist ein filter, damit seine doFilter - Methode aufgerufen, wird für jede Anfrage. Setzen Sie einen Haltepunkt gibt. Und Sie haben noch nicht geklärt ist, warum Sie verwenden alle die gleichzeitige Nutzung der Infrastruktur. Auch, Authentifizierung Parameter in einer URL ist generell verpönt aus Gründen der Sicherheit.
Ich fand heraus, warum meine customAuthFilter nicht immer ausgelöst, für die zweite Anforderung. Es scheint, dass die position, die ich bin aufrufen, es ist falsch. Ich verwendete position="PRE_AUTH_FILTER" früher. Ich habe versucht mit anderen Positionen (wie bei der ERSTEN, BASIC_AUTH_FILTER, etc) und der filter ist in der Lage sich zu authentifizieren, mehrere Anfragen. Doch die anonymous-filter wird immer ausgelöst, nachdem meine customAuthFilter und es ist das überschreiben des security-Kontext mit einem anonymen token. Gibt es eine Möglichkeit, dies zu vermeiden? Ich bin jetzt versucht, die filterProxyChain verwenden Sie nur die benötigten Filter.

InformationsquelleAutor Mahesh Kumar | 2013-02-07

Schreibe einen Kommentar