我有问题让我的Angular2客户端与我的Spring服务器通信,因为我添加了Spring Security性,即当我尝试向服务器登录url发送包含鉴别信息的JSON时,我得到一个403“无效的CSRF令牌'null'是在请求参数'_csrf'或标头'X-CSRF-TOKEN'上找到的。”
我知道我应该在我的响应头上传递一个令牌,供客户端使用,但没有传递这个令牌。我尝试了这个答案,但令牌仍然没有被传递。我也在通过邮递员发送请求,而代币也没有到达。
webSecurityConfig.xml
:
<http entry-point-ref="restAuthenticationEntryPoint">
<intercept-url pattern="/api/**" access="hasRole('ROLE_USER')"/>
<form-login
authentication-success-handler-ref="mySuccessHandler"
authentication-failure-handler-ref="myFailureHandler"
/>
<logout />
</http>
<beans:bean id="mySuccessHandler"
class="com.eficid.cloud.security.rest.AuthenticationSuccessHandler"/>
<beans:bean id="myFailureHandler" class=
"org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"/>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="temp" password="temp" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
SpringSecurityConfiguration
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
@ComponentScan("com.eficid.cloud.security.rest")
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
public SpringSecurityConfig() {
super();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/spring-security-rest/login").permitAll().anyRequest()
.authenticated().and().csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
可能输入错误:
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
必须是X-CSRF-TOKEN,而不是X-XSRF-TOKEN。建议重构。
检查此链接:如何访问Spring CSRF restful web服务
我用JacksonAnnotationIntrospector设置了一个自定义注释,以便根据API版本吐出正确的属性名称。根据API版本,有一个助手类可以输出正确的ObjectMapper。 还有一个帮助函数用于测试序列化 在这样的单元测试中: 现在,假设我有这样的东西: 用户扩展实体时: 我知道映射程序单独返回正确的JSON。我可以直接把电话插进去。实体(),但这会导致我们的测试出现问题,测试会
但是,当我试图模拟一个异常(例如反序列化异常)时,异常消息不会作为响应发送回Tcp客户端。我可以看到我的应用程序侦听器正在获取TcpDeserializationExceptionEvent,并将消息发送到ExceptionEventChannel。@ServiceActivator方法句柄(Message msg)也打印我的异常消息。但它从未到达MessageHandler方法out(Abstr
我将JWT的令牌发送在头中,但客户端需要它在响应的正文中,我如何将它放入响应中:
问题内容: 我在spring框架中有csrf保护。因此,在每个请求中,我都从ajax调用的标头中发送csrf令牌,这非常正常。 在ajax中 我不知道要生成csrf令牌并将其包含在Postman Rest Client的标头部分中吗?您能帮我从Postman Rest Client发送csrf令牌吗? 问题答案: 一致地执行此操作的最简单方法,因此你不必每次都获得令牌: 注意:你需要安装PostM
我正在尝试使用ETags和nginx (1.2.1)服务器理解本地缓存,该服务器将php的请求重定向到php-cgi守护进程。 这里是我的简单索引。电话: 在第二个请求之后,我的浏览器会发送一个 If-None-匹配 标头: 但是我的网络服务器没有返回304: 除非我误解了,否则我的服务器应该将 Etag 与发送的 If-None-Match 进行比较,并返回 304 响应,因为它们是相同的。 我
我在这里遵循 JWT 夸克指南。我想在不允许用户组访问 API 时发送自定义响应。 这是指南中显示的示例。 我如何知道请求是否未经授权,以便我可以发送自定义响应。