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