为了账号安全,请及时绑定邮箱和手机立即绑定

Angular 6 Spring Boot POST 问题

Angular 6 Spring Boot POST 问题

慕运维8079593 2021-12-18 10:01:07
我正在尝试设置一个与本地 Spring Boot REST 应用程序对话的 angular 6 应用程序。我终于能够登录并使用 GET 请求,这些请求似乎使用了正确的 cookie。有 2 个 cookie,一个 JSESSION cookie 和一个 XSRF cookie。问题是我从任何 POST 请求中得到 403 响应。我非常有信心这更多是我的 Spring 设置的问题。弹簧安全配置:@Configurationpublic class CORSConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {    registry.addMapping("/**")        .allowedOrigins("http://localhost:4200")        .allowCredentials(true)        .allowedHeaders("*")        .allowedMethods("GET", "POST", "*")        .exposedHeaders("Set-Cookie","Authorization");}和@Overrideprotected void configure(HttpSecurity http) throws Exception {     http        .cors()     .and()        .httpBasic()     .and()        .authorizeRequests()          .antMatchers("/", "/main", "/user", "/runtime.js","/polyfills.js",                  "/main.js", "/styles.js", "/vendor.js").permitAll()          .anyRequest().authenticated()     .and()        .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())     .and().sessionManagement().maximumSessions(1).and()          .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);}请注意除了“/user”之外的 antMatchers 并没有在这个设置中实际使用。这些文件正在使用 ng serve 本地提供。我的角度设置:@Injectable()export class AuthenticationInterceptor implements HttpInterceptor{intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>{    const xhr = req.clone({        headers: req.headers.set('X-Requested-With', 'XMLHttpRequest'),        withCredentials: true      });      return next.handle(xhr);}此调用现在将起作用:getExercise(id:Number): Observable<Exercise>{    return this.http.get<Exercise>(environment.baseUrl + '/api/exercise/' + id);}但是这个 POST 不会。saveExercise(exercise: Exercise): Observable<Exercise>{   return this.http.post<Exercise>(environment.baseUrl +    '/newExercise',exercise);}
查看完整描述

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 服务器发出请求的服务器。希望附加信息可以帮助某人,如果我找到它,我会尝试在此处发布真正的答案。


查看完整回答
反对 回复 2021-12-18
?
阿晨1998

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);


查看完整回答
反对 回复 2021-12-18
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信