Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在执行自定义筛选器UsernamePasswordAuthenticationFilter后以编程方式返回json响应?_Json_Spring_Security_Filter_Spring Security - Fatal编程技术网

如何在执行自定义筛选器UsernamePasswordAuthenticationFilter后以编程方式返回json响应?

如何在执行自定义筛选器UsernamePasswordAuthenticationFilter后以编程方式返回json响应?,json,spring,security,filter,spring-security,Json,Spring,Security,Filter,Spring Security,我正在创建一个自定义筛选器UsernamePasswordAuthenticationFilter来处理身份验证过程。基本上,当用户通过REST/login执行登录http post时,将执行自定义过滤器,并应响应包含用户详细信息和生成的令牌的json格式 我的问题是在哪里设置对客户端的json响应? 我正在考虑创建SavedRequestAwareAuthenticationSuccessHandler的子类,并在其中设置json响应。这是个好主意吗 任何帮助都将不胜感激=) 谢谢您需要实现自

我正在创建一个自定义筛选器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(…)