2 回答
TA贡献1804条经验 获得超8个赞
对于任何有同样问题的人,做
csrf().disable()
会解决这个问题,虽然我不知道为什么。似乎在使用 cookie 时,spring CSRF 和 CORS 会以某种方式发生冲突......
如果我不得不猜测,下面的内容没有按预期工作
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
这很奇怪,因为它直接引用了 Angular:
A CsrfTokenRepository that persists the CSRF token in a cookie named "XSRF-TOKEN" and
reads from the header "X-XSRF-TOKEN" following the conventions of AngularJS. When
using with AngularJS be sure to use withHttpOnlyFalse().
以上似乎是正确的 - 我看到 CSRF 令牌是由浏览器设置和发送的,但 Spring 不接受它是有效的。(见上面的日志)
Invalid CSRF token found for http://localhost:8080/newExercise
Request Cookies
JSESSIONID 31AD5A7891F8BB83072BFC040AABBB35
XSRF-TOKEN 579db734-412c-4ce8-82a2-20aa097e47f
目前,禁用 CSRF 将适用于开发,但有一个真实的用例可以从单独的服务器为我的 angular 应用程序提供服务,这是唯一应该能够向我的 spring 服务器发出请求的服务器。希望附加信息可以帮助某人,如果我找到它,我会尝试在此处发布真正的答案。
TA贡献2037条经验 获得超6个赞
尝试.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())用csrfTokenRepository和替换你的CsrfFilter:
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
查看完整答案
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/send-pin").permitAll()
.antMatchers("/check-pin").permitAll()
.antMatchers("/index.html", "/", "/login", "/someotherrurl")
.permitAll().anyRequest().authenticated().and().csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
添加回答
举报