2012-03-26 5 views
0

Ich habe eine Anwendung, die SwitchUserFilter verwendet. Das Umschalten und Beenden funktioniert im Normalfall gut, aber wenn wir die Ausgangs-URL geben, wenn der Benutzer nicht tatsächlich gewechselt hat, wird der Benutzer abgemeldet (erwartet), aber wenn er versucht sich erneut anzumelden, versucht die Anwendung umzuleiten ihn auf die letzte Seite, auf die er versuchte zuzugreifen (dh die Switch-Benutzer-URL) .. wo wieder, der Benutzer gefunden wurde, nicht geschaltet haben, und so ein Fehler ausgelöst wird, der Benutzer abgemeldet ist, und so der Zyklus fortgesetzt wird .Spring Sicherheit: "Benutzer wechseln" -Funktionalität verursacht einen Deadlock, wenn wir vor einem Schalter beenden

Im Folgenden ist meine Feder-Konfigurationsdatei:

<?xml version="1.0" encoding="UTF-8"?> 

<!-- - Sample namespace-based configuration - --> 

<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <global-method-security pre-post-annotations="enabled"> 
     <!-- AspectJ pointcut expression that locates our "post" method and applies 
      security that way <protect-pointcut expression="execution(* bigbank.*Service.post*(..))" 
      access="ROLE_TELLER"/> --> 
    </global-method-security> 

    <http use-expressions="true"> 
     <intercept-url pattern="/**" access="isAuthenticated()" /> 
     <custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="switchUserProcessingFilter" /> 
     <form-login /> 
     <logout invalidate-session="true" logout-url="/do/logout" /> 
    </http> 
    <!-- Usernames/Passwords are rod/koala dianne/emu scott/wombat peter/opal --> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service id="userService"> 
       <user name="rod" password="koala" authorities="supervisor, teller, user" /> 
       <user name="dianne" password="emu" authorities="teller, user" /> 
       <user name="scott" password="wombat" authorities="user" /> 
       <user name="peter" password="opal" authorities="user" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 

    <beans:bean id="switchUserProcessingFilter" 
     class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter"> 

     <beans:property name="userDetailsService" ref="userService"> 

     </beans:property> 
     <beans:property name="switchUserUrl" value="/switchUser" /> 
     <beans:property name="exitUserUrl" value="/exitUser" /> 
     <beans:property name="targetUrl" value="/index.jsp" /> 
    </beans:bean> 

</beans:beans> 

Irgendwelche Vorschläge, wie kann ich damit umgehen?

Ein praktischer Fall könnte sein, wenn ich den Benutzer gewechselt habe und die Sitzung abläuft. Ohne zu wissen, dass die Sitzung abgelaufen ist, versucht der Benutzer, auf die URL "Benutzer beenden" zu klicken, die ihn dann zur Anmeldeseite weiterleitet, und der obige Zyklus wird fortgesetzt.

Antwort

0

Wie im this Thread erwähnt, habe ich einen benutzerdefinierten Login-Erfolgshandler implementiert, der SavedRequestAwareAuthenticationSuccessHandler imitiert, was der Standard-Login-Erfolgs-Handler ist. ruft die URL ab, auf die wir zugreifen wollten, bevor sie vom Anforderungscache (wo sie von ExceptionTranslationFilter gespeichert wurde, auf die Anmeldeseite umgeleitet wird) auf die Anmeldeseite umgeleitet wurde und zu dieser URL weiterleitet. Ich habe es einfach so konfiguriert, dass ich zur Root-URL gehe, wenn es so etwas wie 'exitUser'

antrifft
Verwandte Themen