Внедрите правильный ключ API и пользовательский токен JWT в REST API с помощью Spring Boot Security - PullRequest
1 голос
/ 18 июня 2019

В настоящее время я работаю над REST API в Spring Boot.

Несколько человек будут создавать клиенты для этого API, поэтому я хочу выделить их по ключам API.

Также пользователивозможность войти в службу через процесс авторизации, чтобы получить JWT (я знаю, что это не очень RESTful, но я думаю, что это лучший способ сделать это).

Я реализовал три класса фильтров для этих целей:

  • APIKeyAuthFilter extends AbstractPreAuthenticatedProcessingFilter
  • JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter
  • JWTAuthorizationFilter extends BasicAuthenticationFilter

и все работает довольно хорошо индивидуально.

Проблема в том, что уровень безопасности одинаково обрабатывает оба типа аутентификации.Так, например, я могу получать вещи, которые должны видеть только пользователи, только через API-ключ, и нет необходимости в API-ключе, когда у меня есть JWT.

Я думаю, проблема заключается в этом коде в моем подклассе WebSecurityConfigurerAdapter:

httpSecurity
    .antMatcher("/**")
    .csrf().disable()
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
    .addFilter(new JWTAuthenticationFilter(authenticationManager()))
    .addFilter(apiKeyFilter)
    .addFilter(new JWTAuthorizationFilter(authenticationManager()))
    .authorizeRequests().anyRequest().authenticated();

Или весь мой подход неверен, и мне нужно добавить ключи API совершенно по-другому?

1 Ответ

0 голосов
/ 18 июня 2019

Spring Security имеет понятие «предоставленные полномочия» или, другими словами, полномочия, которые система предоставляет Authentication.

Предоставленные полномочия - это способ Spring Security различать, что разрешено делать каждому пользователю. Обычно они предоставляются в a UserDetailsService или, в случае JWT и Spring Security 5.1+, a JwtAuthenticationConverter.

Вы также спросили: "Или весь мой подход неверен, и мне нужно добавить API-ключи совершенно по-другому?" - этот вопрос немного широк, но вы могли бы рассмотреть в качестве первого шага, чтобы оба механизма аутентификации привели к JWT. Возможно, лучшим шагом было бы разделить эту проблему с сервером авторизации (который отлично справляется с выдачей JWT), чтобы ваша служба могла сосредоточиться только на проверке только JWT.

...