【问题标题】:How to programatically return a json response after executing a custom filter UsernamePasswordAuthenticationFilter?执行自定义过滤器 UsernamePasswordAuthenticationFilter 后如何以编程方式返回 json 响应?
【发布时间】:2012-10-04 13:33:04
【问题描述】:

我正在创建一个自定义过滤器 UsernamePasswordAuthenticationFilter 来处理身份验证过程。基本上,当用户通过 REST /login 执行登录 http post 时,自定义过滤器将执行并应响应包含用户详细信息和生成令牌的 json 格式。

我的问题是我在哪里设置以响应客户端的 json 响应? 我正在考虑创建 SavedRequestAwareAuthenticationSuccessHandler 的子类并在那里设置 json 响应。这是个好主意吗?

任何帮助将不胜感激 =)

谢谢

【问题讨论】:

标签: json spring security filter spring-security


【解决方案1】:

您需要实现自己的 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:默认情况下,用户名密码过滤器将在成功登录后重定向,在这种情况下您可能不希望这样做。另请注意,在上述实现中,过滤器链在身份验证成功时终止 - 您必须确保您的过滤器呈现正确的响应,不要依赖底层 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>

【讨论】:

  • 正文应该是response.getWriter().write(...)吗?
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2018-05-18
  • 2010-10-25
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2015-08-15
相关资源
最近更新 更多