Angular 6 Spring Boot POST 问题

我正在尝试设置一个与本地 Spring Boot REST 应用程序对话的 angular 6 应用程序。


我终于能够登录并使用 GET 请求,这些请求似乎使用了正确的 cookie。有 2 个 cookie,一个 JSESSION cookie 和一个 XSRF cookie。问题是我从任何 POST 请求中得到 403 响应。我非常有信心这更多是我的 Spring 设置的问题。


弹簧安全配置:


@Configuration

public class CORSConfig implements WebMvcConfigurer {


@Override

public void addCorsMappings(CorsRegistry registry) {

    registry.addMapping("/**")

        .allowedOrigins("http://localhost:4200")

        .allowCredentials(true)

        .allowedHeaders("*")

        .allowedMethods("GET", "POST", "*")

        .exposedHeaders("Set-Cookie","Authorization");

}


@Override

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

}


慕运维8079593
浏览 142回答 2
2回答

胡说叔叔

对于任何有同样问题的人,做csrf().disable()&nbsp;会解决这个问题,虽然我不知道为什么。似乎在使用 cookie 时,spring CSRF 和 CORS 会以某种方式发生冲突......如果我不得不猜测,下面的内容没有按预期工作.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())这很奇怪,因为它直接引用了 Angular:A CsrfTokenRepository that persists the CSRF token in a cookie named "XSRF-TOKEN" andreads from the header "X-XSRF-TOKEN" following the conventions of AngularJS. When&nbsp;using with AngularJS be sure to use withHttpOnlyFalse().以上似乎是正确的 - 我看到 CSRF 令牌是由浏览器设置和发送的,但 Spring 不接受它是有效的。(见上面的日志)Invalid CSRF token found for http://localhost:8080/newExerciseRequest Cookies&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JSESSIONID&nbsp; 31AD5A7891F8BB83072BFC040AABBB35&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;XSRF-TOKEN&nbsp; 579db734-412c-4ce8-82a2-20aa097e47f目前,禁用 CSRF 将适用于开发,但有一个真实的用例可以从单独的服务器为我的 angular 应用程序提供服务,这是唯一应该能够向我的 spring 服务器发出请求的服务器。希望附加信息可以帮助某人,如果我找到它,我会尝试在此处发布真正的答案。

阿晨1998

尝试.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())用csrfTokenRepository和替换你的CsrfFilter:&nbsp;.csrfTokenRepository(csrfTokenRepository()).and()&nbsp; &nbsp; .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);查看完整答案@Overrideprotected void configure(HttpSecurity http) throws Exception {http.httpBasic().and().authorizeRequests()&nbsp; &nbsp; .antMatchers("/send-pin").permitAll()&nbsp;&nbsp; &nbsp; .antMatchers("/check-pin").permitAll()&nbsp; &nbsp; .antMatchers("/index.html", "/", "/login", "/someotherrurl")&nbsp;&nbsp; &nbsp; .permitAll().anyRequest().authenticated().and().csrf()&nbsp; &nbsp; .csrfTokenRepository(csrfTokenRepository()).and()&nbsp; &nbsp; .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java