Как исправить ошибку 403 в почтовом запросе Spring Boot Post

Я новичок в услугах весенней загрузки. Я разработал некоторые rest api в весенней загрузке, используя проект maven.

Я успешно разработал Получать и Почта Api. Мой метод ПОЛУЧАТЬ работает правильно в почтальоне и мобильном телефоне. когда я пытаюсь использовать метод post от почтальона, он работает правильно, но с мобильного телефона он дает 403 запрещенную ошибку.

Это моя конфигурация:

spring.datasource.url = jdbc:mysql://localhost/sampledb?useSSL=false
spring.datasource.username = te
spring.datasource.password = test
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

Пожалуйста, посоветуйте мне, как решить ошибку.

Как исправить ошибку 403 в почтовом запросе Spring Boot Post

Вы отправляете заголовок с почтальоном? Я думаю, что вы отправляете токен для аутентификации запроса. Вы отправляете этот токен по почте со своего мобильного устройства?

desoss 23.05.2018 12:44

Пожалуйста, добавьте детали вашей конфигурации весенней загрузки.

Jannik Weichert 23.05.2018 12:47

я отправляю только тип контента от почтальона и мобильного @desoss

Harshal Deshmukh 23.05.2018 12:49

пожалуйста, приложите журналы, Spring имеет удивительно читаемые сообщения об ошибках в журналах;)

Jan Ossowski 23.05.2018 12:53

Это мои конфигурации: # spring.datasource.url = jdbc: mysql: //192.168.4.2/maha? UseSSL = false # spring.datasource.username = test # spring.datasource.password = test @ 123 # # ### Свойства Hibernate ## Диалект SQL позволяет Hibernate лучше генерировать SQL для выбранной базы данных # spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect # ## Hibernate ddl auto (create, create-drop, validate, update ) # spring.jpa.hibernate.ddl-auto = обновить @JannikWeichert

Harshal Deshmukh 23.05.2018 12:54

Я не знаю вашей конфигурации, но если на вашем устройстве вы отправляете те же заголовки, URI и HttpMethod почтальона, это должно работать. (Ури прав, правда?: D)

desoss 23.05.2018 12:55

Пожалуйста, отредактируйте свой вопрос и используйте правильный формат. В противном случае это не читается. Кроме того, добавьте свой WebConfiguration.

Jannik Weichert 23.05.2018 12:57

я обновил свой вопрос @ JannikWeichert

Harshal Deshmukh 23.05.2018 13:01

прикрепите скриншот от почтальона и из программы, которую вы используете на своем мобильном телефоне. Должна быть какая-то разница. Возможно, что запросы не работают извне localhost (настройки безопасности разработчика), но тогда GET тоже не будет работать

Jan Ossowski 23.05.2018 13:22

Get корректно работает в мобиле и почтальоне

Harshal Deshmukh 23.05.2018 13:25

Я знаю, приложите пожалуйста скриншоты

Jan Ossowski 23.05.2018 13:26
58
11
69 668
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможные причины:

  1. Запросы от почтальона отличаются от запросов с мобильных устройств (uri, метод, заголовки).
  2. Неверный токен
  3. CORS (почитайте что-нибудь об этом, в Google полно статей) добавьте аннотацию @CrossOrigin к вашему контроллеру.
  4. мобильное приложение выполняет запрос OPTION перед выполнением POST, и вы блокируете запросы OPTION. Если также от почтальона запросы OPTION заблокированы, добавьте свойство spring.mvc.dispatch-параметры-запрос = правда. Более того, если вы используете безопасность Spring, вы должны явно разрешить запросы OPTION и для нее.

Подскажите, пожалуйста, как добавить запрос опции? @desoss

Harshal Deshmukh 23.05.2018 18:02

Я обновил пункт 4 ... дайте мне знать, работает ли с spring.mvc.dispatch-options-request = true.

desoss 23.05.2018 18:33

да, я пытаюсь с этим. я дам вам знать, если сработало

Harshal Deshmukh 23.05.2018 18:34

Да, вы правы - запрос POST от Postman считался CORS, но просто интересно, почему запросы GET от Postman проходили, даже если CORS отключен?

Māris Rubenis 15.07.2020 07:50
Ответ принят как подходящий

вам нужно отключить защиту csrf, потому что она включена по умолчанию в Spring Security: здесь вы можете увидеть код, разрешающий происхождение cors.

import org.springframework.context.annotation.Bean;
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.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.cors().and().csrf().disable();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

}

отключение csrf сделало мои запросы POST успешными! какое облегчение.

Pragalathan M 06.10.2019 10:35

Спасибо, мой друг! Вы сэкономили мне время!

AlexKh 12.04.2020 21:15

У меня была такая же ситуация в сочетании с аутентификацией на основе JWT. Это решение сработало для меня с одним дополнением: мне пришлось разрешить передачу запроса «OPTIONS» без JWT в заголовке авторизации.

Marina982 08.07.2020 19:13

Почему отключение разрешенного метода публикации csrf?

sylikon 10.09.2020 14:33

@Ezzat Eissa - Отключение csrf, безусловно, работает. Но это также делает наши API уязвимыми, не так ли? Если да, то как убедиться, что токен csrf настроен как на стороне сервера, так и на стороне клиента?

dev 31.03.2021 12:28

Основываясь на принятом ответе

Многие клиентские библиотеки HTTP (например, Axios) неявно устанавливают заголовок Content-Type: JSON для запросов POST. В моем случае я забыл разрешить этот заголовок, вызывая сбой только POSTS.

@Bean
CorsConfigurationSource corsConfigurationSource() {
    ...
    configuration.addAllowedHeader("Content-Type"); // <- ALLOW THIS HEADER 
    ...
}

Другие вопросы по теме