Конфигурация Spring Boot Cors. Я получаю 401 в моем приложении реагированияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Конфигурация Spring Boot Cors. Я получаю 401 в моем приложении реагирования

Сообщение Anonymous »

Я впервые использую Springboot, и у меня возникла проблема с конфигурацией cors.
Я пробовал много вещей, но всегда получаю:
Доступ для загрузки по адресу 'http: //localhost:52700/greeting-javaconfig' из источника 'http://localhost:3000' заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok.
Я сталкиваюсь с этой ошибкой уже неделю или около того, и я играл с файлами конфигурации cors со многими свойствами, но, похоже, не могу заставить ее работать
Я создал файл CorsConfig.java в папке конфигурации со следующим кодом:

Код: Выделить всё

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*") // Allow requests from any origin
.allowedMethods("GET", "POST", "PUT", "DELETE") // Allowed HTTP methods
.allowedHeaders("*"); // Allowed headers
}

@Bean
CorsWebFilter corsWebFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);

return new CorsWebFilter(source);
}
}
Мне это кажется стандартным, и я видел много примеров, которые используют этот более или менее одинаковый формат.
И еще я заметил, что мне нужен фильтр cors из несколько примеров, поэтому я также добавил это в проект, заметив, что без него он все равно не работает:

Код: Выделить всё

package com.example.config;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

@Component
public class CorsFilter implements WebFilter {
@Override
public Mono  filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse().getHeaders().add("Access-Control-Allow-Origin", "*");
exchange.getResponse().getHeaders().add("Access-Control-Allow-Methods", "GET, PUT, POST,                       DELETE, OPTIONS");
exchange.getResponse().getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
exchange.getResponse().getHeaders().add("Access-Control-Max-Age", "3600");
return chain.filter(exchange);
}

}
при тестировании этого кода с помощью отладчика и почтальона я получаю ответ, и точка останова запускает эту функцию фильтра.
У меня также есть базовая аутентификация , я не знаю, имеет ли это значение для вопроса, но я все равно добавлю свой код вместе с контроллером на тот случай, если я не упущу какую-либо важную информацию.
SecurityConfig.java:

Код: Выделить всё

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.server.SecurityWebFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring()
// Spring Security should completely ignore URLs starting with /resources/
.requestMatchers("/**");
}

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().requestMatchers("/**").permitAll().anyRequest()
.hasRole("USER").and()
.formLogin()
.permitAll();
http.cors().disable();

return http.build();
}
@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User
.withUsername("user1")
.password("{noop}user1Pass")  // {noop} for plain text, consider a password encoder for production
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}

}
Базовый контроллер:

Код: Выделить всё

package com.example.controller;
import com.makalu.makaluapi.models.Greeting;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.atomic.AtomicLong;

@RestController
public class BaseController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@CrossOrigin(origins = "http://localhost:3000/")
@GetMapping("/greeting-javaconfig")
public Greeting greeting(@RequestParam(required = false, defaultValue = "World") String name) {
System.out.println("==== get greeting ====");
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
Было очень неприятно пытаться заставить это работать, но, тем не менее, это интересная и важная тема. Я буду признателен за любую информацию по этому вопросу, спасибо!
А еще это код, который я использую для вызова API, я пробовал это:

Код: Выделить всё

const url = 'http://localhost:52700/greeting-javaconfig';

username = 'user1';
password = 'user1Pass';

const credentials = btoa(username + ':' + password);

const options = {
method: 'GET',
headers: {
'Authorization': 'Basic ' + credentials,
'Content-Type': 'application/json',
'Accept': 'text/html',
'cache-control': 'no-cache'
},
// credentials: 'same-origin'
};

// @ts-ignore
fetch(url, options).then(response => {
console.log(response.body);
})
для получения дополнительной информации я также запустил этот запрос на завивку:

Код: Выделить всё

curl -v -u user1:user1Pass -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost:3004" -X GET http://localhost:52700/greeting-javaconfig
И получил такой результат:

Код: Выделить всё

Note: Unnecessary use of -X or --request, GET is already inferred.
*   Trying 127.0.0.1:52700...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 52700 (#0)
* Server auth using Basic with user 'user1'
> GET /greeting-javaconfig HTTP/1.1
> Host: localhost:52700
> Authorization: Basic dXNlcjE6dXNlcjFQYXNz
> User-Agent: curl/7.68.0
> Accept: */*
> Access-Control-Request-Method: GET
> Origin: http://localhost:3004
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
< Access-Control-Allow-Headers: Content-Type, Authorization
< Access-Control-Max-Age: 3600
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-XSS-Protection: 0
< Referrer-Policy: no-referrer
< Content-Type: application/json
< Content-Length: 34
< Date: Tue, 16 Apr 2024 08:43:30 GMT
<
Я не знаю, важно ли это, но я все равно добавлю это для большего контекста.
Я ожидал получить 200ОК, но получил 401 неавторизованно клиент, но в почтальонах получаю 200ОК и возвращаемое значение.

Подробнее здесь: https://stackoverflow.com/questions/783 ... -react-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»