У меня есть REST API, который я написал на Spring Boot. Я хочу написать для него интерфейс с помощью React. Для начала я решил убедиться, что мой фронтенд корректно получает данные от API.
Вот мой код контроллера:
@RestController
@RequestMapping("/api/restaurants")
public class RestaurantRestController {
private final RestaurantService restaurantService;
public RestaurantRestController(RestaurantService restaurantService) {
this.restaurantService = restaurantService;
}
@GetMapping
// @PreAuthorize("hasAuthority('everything:read entries')")
@ApiOperation("Get all restaurants")
public ResponseEntity<List<RestaurantDto>> getAll() {
List<RestaurantDto> result = restaurantService.findAll().stream()
.map(RestaurantDto::fromRestaurant)
.collect(Collectors.toList());
return new ResponseEntity<>(result, HttpStatus.OK);
}
Я написал класс конфигурации на стороне сервера:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000/")
.allowedMethods("GET", "POST, "PUT", "DELETE")
.allowCredentials(true).maxAge(3600);
}
}
И я получаю доступ к своему контроллеру из внешнего интерфейса с помощью этого метода:
import axios from 'axios';
const REST_URL = "http://localhost:8080/api/restaurants";
export default class RestaurantsAPI {
static async getAll() {
const response = await axios.get(REST_URL);
return response.data
}
}
И получаю корректный ответ.
Затем я добавляю credentials в свой запрос:
import axios from 'axios';
const REST_URL = "http://localhost:8080/api/restaurants";
export default class RestaurantsAPI {
static async getAll() {
const response = await axios.get(REST_URL, {
auth: {
username: 'admin', password: 'admin'
}
});
return response.data
}
}
Теперь я вижу это в консоли:
При этом не важно, я оставляю доступ к методу открытым для всех, используя такую конфигурацию:
.antMatchers(HttpMethod.GET, "/api/restaurants").permitAll()
Или наоборот, комментирую эту конфигурацию и применяю аннотацию к методу:
@PreAuthorize("hasAuthority('everything:read entries')")
Я получаю ту же ошибку. Благодаря Postman и JUnit Tests я знаю, что Spring Security настроен и работает правильно. Наверняка кто-то знает в чем причина такого поведения и как это исправить? Спасибо.