Spring Security — метод POST для antMatcher (не antMatchers)

#java #spring #spring-boot #spring-security #spring-config

#java #spring #spring-загрузка #spring-безопасность #spring-config

Вопрос:

У меня есть две конфигурации:

@Order(1)

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/api/**")
        .authorizeRequests()
        .anyRequest().hasRole("USER")
        .and()
        .httpBasic()
        .and()
        .csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(new ApiAuthenticationEntryPoint(objectMapper));
}
  

@Order(2)

 http.authorizeRequests()
    .antMatchers("/product/**").hasRole(SecurityRoles.USER)
    .and()
    .formLogin()
    .loginPage("/login")
    .loginProcessingUrl("/authenticateTheUser")
    .successHandler(customAuthenticationSuccessHandler)
    .permitAll()
    .and()
    .logout()
    .permitAll()
    .and()
    .exceptionHandling()
    .accessDeniedPage("/access-denied");
  

Мне нужно добавить функциональность для регистрации нового пользователя в конечной точке REST /api/users без аутентификации. Другие /api/** конечные точки должны оставаться с базовой аутентификацией. Как это сделать? Я не вижу метода antMatcher с возможностью выбора типа метода http.

Редактировать:

Мне нужно что-то вроде этого:

 http.antMatcher("/api/users", HttpMethod.POST.toString).permitAll()
    .and()
    .antMatcher("/api/**")
            .authorizeRequests()
            .anyRequest().hasRole("USER")
(...)
  

Комментарии:

1. Для antMatcher (единственное число) такого метода не существует. Интерфейс намеренно минимален. В JavaDoc говорится , что «Если необходима более продвинутая конфигурация, рассмотрите возможность использования requestMatchers() or requestMatcher(RequestMatcher) «.

2. Смотрите мою правку. Не могли бы вы показать мне, как это сделать, пожалуйста? Из-за двух конфигураций (REST WWW) у меня проблема с тем, как правильно настроить конечные точки моего API с использованием antMatchers (множественное число). Я мог настроить только все конечные точки API /api/** . Но не знаю, как разрешить один конкретный /api/users/ с помощью POST.

Ответ №1:

Вы можете сделать это с помощью antMatchers() , хотя:

 http
    .antMatcher("/api/**")
        .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/user").permitAll()
            .anyRequest().hasRole("USER")
  

Разница между antMatcher(..) и antMatchers(..) заключается в том, что вы используете antMatcher(..) , когда у вас есть отдельные классы конфигурации безопасности. Это может быть необходимо, когда вам нужно различать:

  • Механизмы аутентификации (форма входа, базовая аутентификация, …)
  • Обработка CSRF
  • Управление сеансом
  • Фильтры
  • Службы сведений о пользователе

antMatchers(..) С другой стороны (внутри authorizeRequests(..) ) используется для различения уровней авторизации (какие роли имеют доступ к определенной конечной точке).

В вашем случае конфигурация подпадает под последнее, поскольку вам нужно различать только полномочия POST /api/user конечной точки.


Однако, если вам действительно нужен более детальный контроль над тем, какой класс конфигурации безопасности следует применять, то вам следует использовать RequestMatcher , как указано в комментариях.

Этот интерфейс имеет единственный HttpServletRequest аргумент и ожидает, что вы вернете boolean . Поскольку HttpServletRequest содержит всю необходимую вам информацию, такую как путь и метод HTTP, вы можете правильно настроить, какой класс конфигурации следует применять. Однако в данном случае в этом нет необходимости.