独自の SuccessHandler を実装し、それを UsernamePasswordAuthenticationFilter に挿入する必要があります。
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
}
}
}
NoRedirectStrategy に注意してください。デフォルトでは、 UsernamePassword フィルターは、ログオンが成功した後にリダイレクトされますが、この場合はおそらく必要ありません。また、上記の実装では、フィルター チェーンが認証の成功時に終了することに注意してください。フィルターが適切な応答をレンダリングすることを確認する必要があります。基礎となるサーブレットに頼ってはいけません。
または、リダイレクトをそのままにして、クライアントを別の URL に送信し、探している JSON 応答をレンダリングすることもできます。
サンプル セキュリティ コンテキスト:
<!-- 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>