Spring Security - метод POST для antMatcher (не antMatchers) - PullRequest
1 голос
/ 25 марта 2019

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

@ 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 Ответ

1 голос
/ 25 марта 2019

Вы можете сделать это с помощью 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, вы можете правильно настроить, какой класс конфигурации следует применять. Однако в этом случае это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...