AntMatchers безопасности Spring не применяется к запросам POST и работает только с GET

Я использую библиотеку безопасности Spring для защиты API REST в своем приложении, сейчас я пытаюсь разрешить доступ ко всем URL-адресам (временно), но с приведенной ниже конфигурацией я обнаружил, что разрешены только запросы GET, но не запросы POST (где я получаю 403 запрещенный ответ), я понимаю, что первый antmatcher ниже должен разрешать как GET, так и POST, но на самом деле 2 antMatcher не могли разрешить POST

Может кто-нибудь посоветовать мне, что мне здесь не хватает?

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
// first I have tried only this antMatcher
            .antMatchers("/**").permitAll()
// But then it didn't allow POST even when only using the line below
            .antMatchers(HttpMethod.POST, "/**").permitAll()
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
7 676
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно сделать что-то подобное, и вы должны упомянуть роль

http
  .httpBasic().and()
  .authorizeRequests()
    .antMatchers(HttpMethod.POST, "/employees").hasRole("ADMIN")
    .antMatchers(HttpMethod.PUT, "/employees/**").hasRole("ADMIN")

Надеюсь, это решит вашу проблему.

Спасибо, но я пытаюсь разрешить все в настоящее время, поэтому роль не нужна, это работает для GET, но не для POST

Ahmed Elkoussy 28.06.2018 11:57

попробуйте вот так .antMatchers (HttpMethod.OPTIONS, tokenEndpointPath) .permitAll ()

Bala venkatesh 28.06.2018 12:06

пожалуйста, добавьте это, потому что по умолчанию csrf будет включен '.csrf (). disable ()'

Bala venkatesh 28.06.2018 13:10

зачем мне удалять защиту csrf?

Ahmed Elkoussy 28.06.2018 14:52
Ответ принят как подходящий

После некоторого расследования выяснилось, что antMatcher работает так, как ожидалось, и разрешает все URL-адреса, как предполагалось, но причиной запрещенного ответа, который я получал для API-интерфейсов POST, было то, что безопасность Spring ждала токен csrf для этих запросов POST, потому что CSRF защита включена по умолчанию в весенней безопасности.

Итак, чтобы он работал так, вы должны предоставить токен csrf в запросе POST ИЛИ вы можете временно отключить защиту CSRF (но вы должны включить ее снова, прежде чем переходить в производство, поскольку это серьезная атака)

Пример кода для этого:

protected void configure(HttpSecurity http) throws Exception {
    http
        // disabling csrf here, you should enable it before using in production
        .csrf().disable()
        .authorizeRequests()
       // this matcher is working for all GET/POST/... , any URL matching the reg expression
            .antMatchers("/**").permitAll()
}

Согласитесь с csrf().disable(), без этого никакие POST, PUT и DELETE не пройдут.

Manuel Jordan 12.03.2021 00:03

Спасибо, у меня такая же проблема, и это сводило меня с ума

AJPerez 18.06.2021 10:37

Рад, что помог :)

Ahmed Elkoussy 18.06.2021 11:09

Как указано пользователем, задавшим вопрос в вашем собственном ответе, запрещенная ошибка 403 может быть вызвана защитой CSRF. Но вместо того, чтобы отключить эту защиту, вы можете исключить некоторые AntMatcher, например:

http
                (...) // oculted for brevity
                .and()
                .csrf()
                    .ignoringAntMatchers("/api/a", "/api/b")

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