如何在执行自定义筛选器UsernamePasswordAuthenticationFilter后以编程方式返回json响应?
我正在创建一个自定义筛选器UsernamePasswordAuthenticationFilter来处理身份验证过程。基本上,当用户通过REST/login执行登录http post时,将执行自定义过滤器,并应响应包含用户详细信息和生成的令牌的json格式 我的问题是在哪里设置对客户端的json响应? 我正在考虑创建SavedRequestAwareAuthenticationSuccessHandler的子类,并在其中设置json响应。这是个好主意吗 任何帮助都将不胜感激=)如何在执行自定义筛选器UsernamePasswordAuthenticationFilter后以编程方式返回json响应?,json,spring,security,filter,spring-security,Json,Spring,Security,Filter,Spring Security,我正在创建一个自定义筛选器UsernamePasswordAuthenticationFilter来处理身份验证过程。基本上,当用户通过REST/login执行登录http post时,将执行自定义过滤器,并应响应包含用户详细信息和生成的令牌的json格式 我的问题是在哪里设置对客户端的json响应? 我正在考虑创建SavedRequestAwareAuthenticationSuccessHandler的子类,并在其中设置json响应。这是个好主意吗 任何帮助都将不胜感激=) 谢谢您需要实现自
谢谢您需要实现自己的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筛选器将在成功登录后重定向,在本例中,您可能不希望这样做。另外请注意,在上面的实现中,验证成功后过滤器链将终止-您必须确保过滤器呈现正确的响应,而不是依赖底层servlet来为您执行此操作
或者,您可以保留重定向,并将客户端发送到另一个URL,该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>
是否有理由实现一个自定义过滤器,而不只是使用spring安全配置转发到一个生成所需json的servlet?@mael:原因是覆盖默认的j_用户名/j_密码登录参数名称。所以我把它改为username/password。不需要实现你自己的过滤器就可以了:谢谢@Xaerxess,但这不是我最初的问题。问题出在我发布的=)@mael中-一个原因是表单提交后的Ext JS希望返回JSON,转发给它一个HTML文档。正文是否应该是response.getWriter().write(…)
?