Vaadin + Spring Boot возвращает ошибку 403 Forbidden при запросах PUT, POST, DELETE

Реализую простое веб-приложение с использованием REST Api на Java с помощью Spring Boot + Vaadin. Также в проекте подключена Security, осуществляется простой вход по логину-паролю. Get() запросы выполняются нормально, но на запросах PUT, POST, DELETE возникает ошибка 403 "Forbidden".

Пробовал отключать csrf методом http.httpBasic().and().csrf().disable(), не помогает, да и в продакшене такое не рекомендуется.

Пробовал также добавлять в antMatchers() специально тип запроса вроде такого: http.httpBasic().and().authorizeRequests().antMatchers(HttpMethod.POST,"/**").permitAll(), тоже не помогает.

Код класса-конфигурации:

@EnableWebSecurity
@Configuration
public class SecurityConfig extends VaadinWebSecurity {

    private static class SimpleInMemoryUserDetailsManager extends InMemoryUserDetailsManager {
        public SimpleInMemoryUserDetailsManager() {
            createUser(Manager.withUsername("manager1")
                    .password("{noop}123")
                    .roles(ROLE_MANAGER)
                    .build());
            createUser(Manager.withUsername("manager2")
                    .password("{noop}123")
                    .roles(ROLE_MANAGER)
                    .build());
        }
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().and().authorizeRequests().antMatchers("/enterprises/**").hasRole(ROLE_MANAGER);

        super.configure(http);

        setLoginView(http, LoginView.class);
    }

    @Bean
    public InMemoryUserDetailsManager enterprisesService() {
        return new SimpleInMemoryUserDetailsManager();
    }
}

Rest-контроллер:

@org.springframework.web.bind.annotation.RestController
@RequestMapping(path = "/")
public class RestController {

    @Autowired
    private VehiclesRepository vehiclesRepository;
    @Autowired
    private EnterprisesRepository enterprisesRepository;
    @Autowired
    private DriversRepository driversRepository;
    @Autowired
    private ManagersRepository managersRepository;

    @GetMapping(
            path = "/vehicles",
            produces = "application/json")
    public VehiclesDto getVehicles() {
        VehiclesDto vehiclesDto = new VehiclesDto();
        for (Vehicle vehicle : vehiclesRepository.findAll()) {
            vehiclesDto.getVehicles().add(vehicle);
        }
        return vehiclesDto;
    }

    @GetMapping(
            path = "/enterprises",
            produces = "application/json")
    public @ResponseBody EnterprisesDto getEnterprises(@RequestParam("managerId") String managerId) {
        Manager manager = null;
        for (Manager managerFromRepo : managersRepository.findAll()) {
            if (managerFromRepo.getId().equals(Long.parseLong(managerId))) {
                manager = managerFromRepo;
                break;
            }
        }
        EnterprisesDto enterprisesDto = new EnterprisesDto();
        if (manager == null) return enterprisesDto;
        for (Enterprise enterprise : enterprisesRepository.findAll()) {
            if (manager.getEnterprises().contains(enterprise.getId()))
                enterprisesDto.getEnterprises().add(enterprise);
        }
        return enterprisesDto;
    }

    @GetMapping(
            path = "/drivers",
            produces = "application/json")
    public DriversDto getDrivers() {
        DriversDto driversDto = new DriversDto();
        for (Driver driver : driversRepository.findAll()) {
            driversDto.getDrivers().add(driver);
        }
        return driversDto;
    }

    @PostMapping("/createVehicle")
    public @ResponseBody String createVehicle(@RequestBody String info) {
        return "it works!!!";
    }

    @DeleteMapping("/deleteVehicle")
    public @ResponseBody String deleteVehicle(){
        return "it works!!!";
    }
}

Тестирую запросы через Postman, используя Basic Authentication.


Ответы (1 шт):

Автор решения: Sergei Krainyukov

Нашел решение проблемы с помощью отключения csrf для конкретных запросов:

http.csrf().ignoringRequestMatchers(new AntPathRequestMatcher("/enterprises/**"));
→ Ссылка