gpt4 book ai didi

json - 执行自定义过滤器 UsernamePasswordAuthenticationFilter 后如何以编程方式返回 json 响应?

转载 作者:行者123 更新时间:2023-12-04 08:12:08 24 4
gpt4 key购买 nike

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

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

任何帮助将不胜感激 =)

谢谢

最佳答案

您需要实现自己的 SuccessHandler 并将其注入(inject) 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>

关于json - 执行自定义过滤器 UsernamePasswordAuthenticationFilter 后如何以编程方式返回 json 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com