Ограничить метод проверки подлинности для конечных точек с Spring Security

Я хочу защитить REST API. Правила просты.

  • Пользователь должен позвонить/api/authenticate, чтобы получить маркер
  • Пользователь может использовать маркер (полученный от/api/authenticate) для доступа к API /api/**
  • Конечная /api/authenticateточка принимает только обычную проверку подлинности HTTP (без проверки подлинности маркера)
  • Конечные /api/**точки (исключая/api/authenticate) принимают только маркерную проверку подлинности (без обычной проверки подлинности)
  • Все остальные конечные точки являются открытыми и не требуют проверки подлинности.

Я действительно использую это:

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Autowired
        private TokenAuthenticationProvider tokenAuthenticationProvider;

        @Override
        protected void configure(final HttpSecurity httpSecurity) throws Exception {
            httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            httpSecurity.headers().disable();
            httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
            httpSecurity.antMatcher("/api/authenticate").httpBasic();
            httpSecurity.antMatcher("/api/**").apply(new TokenAuthenticationConfigurer());
            httpSecurity.authorizeRequests()
                    .antMatchers("/api/**").authenticated()
                    .anyRequest().permitAll();
        }
    }

На самом деле, если я отправляю запрос с токеном в /api/authenticateмою конфигурацию, он принимает запрос. Я думаю, что это происходит потому/api/authenticate, что является частью /api/**. Поэтому мне нужно исключить этот путь для проверки подлинности маркера.

Как я могу это сделать?

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

Если я использую стиль .and()fluent, результат будет точно таким же.

    @Override
    protected void configure(final HttpSecurity httpSecurity) throws Exception {
        httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
        httpSecurity
                .headers().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .antMatcher("/api/authenticate").httpBasic()
                .and()
                .antMatcher("/api/**").apply(new TokenAuthenticationConfigurer())
                .and()
                .authorizeRequests().antMatchers("/api/**").authenticated().anyRequest().permitAll();
    }

EDIT 2

Как я понимаюSecurityBuilder, (HttpSecurity), каждый вызов antMatcher(...)в configure(...)методе перезаписывает предыдущий вызов. В журналах отладки я вижу, что Spring Security всегда пытается соответствовать пути запроса/api/**, но никогда не agains /api/authenticate. Если я переключу порядок, я больше не смогу получить доступ к API, просто /api/authenticateпотому , что Spring Security теперь всегда пытается соответствовать agains /api/authenticate.

Вопрос в том, как зарегистрировать несколько правил:

  • /api/authenticate -> HttpBasicConfigurer (.http())
  • /api/** — > >TokenAuthenticationConfigurer(моя аутентификация токена настроена, .apply(...))

1 ответ

  1. Возможно, это связано с тем, что вы всегда переопределяете конфигурацию родителя и не используете and()метод:

    Конфигурация Java, эквивалентная закрытию XML-тега, выражается с помощью метода and (), который позволяет нам продолжить настройку родителя. Если Вы читаете код, это также имеет смысл. Я хочу настроить авторизованные запросы и настроить форму входа в систему и настроить обычную аутентификацию HTTP.

    http://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#jc-httpsecurity