Пружинная охрана 401 Несанкционировано даже при наличии разрешения Все

Я использую безопасность Spring для защиты некоторых конечных точек в моей службе REST.

вот класс конфигурации безопасности:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // Other methods

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()
                .antMatchers(HttpMethod.POST, "/api/auth/**")
                .permitAll()
                .anyRequest()
                .authenticated();

        // Add our custom JWT security filter
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    }
}

Как видите, мне предоставлен полный доступ к / api / auth / регистрация и / API / аутентификация / вход, используя: .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll()

по какой-то причине, когда я попробовал этот запрос в почтальоне, запрос "зарегистрироваться" работал нормально, но "войти" не работает и дает мне «401 неавторизованный»
я пробовал также .antMatchers("/**").permitAll()

вот мой контроллер:

@RestController
public class UserController {

    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping("/api/auth/signup")
    public ResponseEntity<RestResponse> registerUser(@Valid @RequestBody SignUpRequest signUpRequest,
                                                     UriComponentsBuilder uriComponentsBuilder)  {
        RestResponse restResponse = this.userService.register(signUpRequest);
        UriComponents uriComponents = uriComponentsBuilder.path("/users").buildAndExpand();
        return ResponseEntity.created(uriComponents.toUri()).body(restResponse);
    }

    @PostMapping("/api/auth/signin")
    public ResponseEntity<JwtAuthenticationResponse> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
        return ResponseEntity.ok(this.userService.login(loginRequest));
    }
}

Можете попробовать отключить строчку .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)? Обычно методы точки входа также возвращают статус 401.

Kedar Joshi 20.10.2018 14:35

это дает мне 403 запрещенных

Ayoub k 22.10.2018 23:14

Покажите свою реализацию JwtAuthenticationFilter.

dur 23.10.2018 10:21

@Ayoubk Ваша конфигурация выглядит нормально - можете ли вы попробовать удалить HttpMethod.POST и сделать его antMatchers ("/ api / auth / **") только для целей тестирования. Можете ли вы подтвердить, что отправляете правильные типы HTTP-запросов от Postman при вызове конечных точек REST?

hovanessyan 23.10.2018 18:10

Пожалуйста, добавьте к вопросу запрос signin.

Boris 26.10.2018 18:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
5
10 212
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

В последний раз я помню, что порядок важен.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/auth/**")
                .permitAll()
                .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()                   
                .anyRequest()
                .authenticated();

        // Add our custom JWT security filter
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    }
Ответ принят как подходящий

У меня была такая же проблема, не уверен, но я думаю, вам нужен такой порядок:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/auth/**")
            .permitAll()
            .antMatchers("/",
                    "/favicon.ico",
                    "/**/*.png",
                    "/**/*.gif",
                    "/**/*.svg",
                    "/**/*.jpg",
                    "/**/*.html",
                    "/**/*.css",
                    "/**/*.js")
            .permitAll()                   
            .anyRequest()
            .authenticated()
            .and()
            .cors()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .csrf()
            .disable();

    // Add our custom JWT security filter
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

}

В чем проблема у меня: http.authorizeRequests (). AntMatchers (HttpMethod.GET, "/ get / **"). AllowAll (); Я все еще получаю несанкционированную ошибку.

vsk.rahul 24.07.2019 18:55

Я попробовал именно так, как вы указали выше, и ничего такого, все еще давая код состояния 401.

Francisco Souza 25.09.2019 22:06

Ваша конфигурация не работает из-за порядка, в котором оценивается antMatcher

 .and()
 .authorizeRequests()
 .antMatchers("/",
    "/favicon.ico",
    "/**/*.png",
    "/**/*.gif",
    "/**/*.svg",
    "/**/*.jpg",
    "/**/*.html",
    "/**/*.css",
    "/**/*.js")
 .permitAll()
 .antMatchers(HttpMethod.POST, "/api/auth/**")
 .permitAll()
 .anyRequest()
 .authenticated();

Порядок правила соответствия запроса имеет значение, и в первую очередь должны быть указаны более конкретные правила. Существует некоторый конфликт между обоими правилами antMatcher, поэтому второе правило, то есть .antMatchers (HttpMethod.POST, "/ api / auth / ") **, игнорируется.

Следовательно, порядок должен быть следующим: -

 .antMatchers(HttpMethod.POST, "/api/auth/**")
 .permitAll()
 .antMatchers("/",
    "/favicon.ico",
    "/**/*.png",
    "/**/*.gif",
    "/**/*.svg",
    "/**/*.jpg",
    "/**/*.html",
    "/**/*.css",
    "/**/*.js")
 .permitAll()

Вам необходимо добавить в свой метод настройки следующее: / error - это откат по умолчанию, когда в приложении возникает ошибка из-за какого-либо исключения, и по умолчанию он защищен.

    protected void configure(HttpSecurity httpSecurity) throws Exception {
    //disable CRSF
    httpSecurity
            //no authentication needed for these context paths
            .authorizeRequests()
            .antMatchers("/error").permitAll()
            .antMatchers("/error/**").permitAll()
            .antMatchers("/your Urls that dosen't need security/**").permitAll()

Также приведенный ниже фрагмент кода

 @Override
 public void configure(WebSecurity webSecurity) throws Exception
   {
     webSecurity
    .ignoring()
        // All of Spring Security will ignore the requests
        .antMatchers("/error/**")
     }  

Теперь вы не получите 401 и не получите исключение 500 с подробностями, когда возникло исключение для разрешений на все URL

У меня была такая же проблема, и это было связано с тем, что Я не использовал схему jdbc по умолчанию, поэтому я передавал запросы, необходимые для UserDetailsService по умолчанию, а моя таблица полномочий была пустой, поэтому поиск по имени пользователя не получал результатов.

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