2012-10-14 1 views
8

Ich erstelle einen benutzerdefinierten Filter UsernamePasswordAuthenticationFilter, um den Authentifizierungsprozess zu verarbeiten. Grundsätzlich wird der benutzerdefinierte Filter ausgeführt und sollte ein JSON-Format mit Benutzerdetails und generiertem Token beantworten, wenn der Benutzer die HTTP-Anmeldung über die REST/Anmeldung ausführt.Wie wird eine JSON-Antwort nach dem Ausführen eines benutzerdefinierten Filters programmgesteuert zurückgegeben? BenutzernamePasswordAuthenticationFilter?

Mein Problem ist, wo setze ich, um eine JSON Antwort auf den Client zu reagieren? Ich denke über das Erstellen einer Unterklasse von SavedRequestAwareAuthenticationSuccessHandler und legen Sie dort die JSON-Antwort. Ist das eine gute Idee?

Jede Hilfe wird sehr geschätzt =)

Dank

+0

Gibt es einen Grund einen benutzerdefinierten Filter für die Implementierung, anstatt nur die Federsicherheitskonfiguration verwenden, um ein Servlet zu übermitteln, die die json produzieren Sie brauchen? – ElderMael

+0

@ Mael: Der Grund ist, die standardmäßigen j_username/j_password Login-Parameter Namen zu überschreiben. Also habe ich es in Benutzername/Passwort geändert. – Warner

+0

Es ist nicht notwendig, einen eigenen Filter nur dafür zu implementieren: [_Die Standard-Parameternamen, die verwendet werden, sind in den statischen Feldern SPRING_SECURITY_FORM_USERNAME_KEY und SPRING_SECURITY_FORM_PASSWORD_KEY enthalten. ** Die Parameternamen können auch geändert werden, indem Sie die Eigenschaften usernameParameter und passwordParameter festlegen ** ._] (http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/ Sicherheit/Web/Authentifizierung/UsernamePasswordAuthenticationFilter.html) – Xaerxess

Antwort

5

Sie müssen Ihre eigenen SuccessHandler implementieren und in UsernamePasswordAuthenticationFilter zu injizieren:

public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { 

    public MyAuthenticationSuccessHandler() { 
     super(); 
     setRedirectStrategy(new NoRedirectStrategy()); 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
      Authentication authentication) throws IOException, ServletException { 

      super.onAuthenticationSuccess(request, response, authentication); 
      response.write("my JSON response"); 
    } 


    protected class NoRedirectStrategy implements RedirectStrategy { 

     @Override 
     public void sendRedirect(HttpServletRequest request, 
       HttpServletResponse response, String url) throws IOException { 
      // no redirect 

     } 

    } 

} 

Hinweis die NoRedirectStrategy: testamentarisch Standard UsernamePassword Filter Redirect nach einer erfolgreichen Anmeldung, die Sie in diesem Fall wahrscheinlich nicht möchten. Beachten Sie auch, dass in der obigen Implementierung die Filterkette bei Authentifizierungserfolg beendet wird - Sie müssen sicherstellen, dass Ihr Filter die richtige Antwort rendert, verlassen Sie sich nicht auf das zugrunde liegende Servlet, um es für Sie zu tun.

Alternativ können Sie die Weiterleitung an ihrem Platz belassen und den Client an eine andere URL senden, die wiederum die von Ihnen gesuchte JSON-Antwort darstellt.

Beispielsicherheitskontext:

<!-- Security --> 
    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> 
     <sec:filter-chain-map path-type="ant"> 
      <sec:filter-chain pattern="/rest/login" filters="wsFilter"/> 
     </sec> 
    </bean> 

    <bean id="wsFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
     <property name="authenticationManager" ref="myAuthenticationManager"/> 
     <property name="authenticationSuccessHandler" ref="myAuthSuccessHandler"/> 
     <property name="passwordParameter" value="pass"></property> 
     <property name="usernameParameter" value="user"></property> 
     <property name="postOnly" value="false"></property> 
    </bean> 

     <bean id="myAuthSuccessHandler" class="com.my.MyAuthenticationSuccessHandler"/> 

    <sec:authentication-manager id="myAuthenticationManager" > 
     <sec:authentication-provider user-service-ref="UserDetailsImpl"> 
      <sec:password-encoder hash="md5"> 
      </sec:password-encoder> 
     </sec:authentication-provider> 
    </sec:authentication-manager> 
+0

Sollte dieses Bodywriting 'response.getWriter() sein. Write (...)'? – Pianosaurus