Обеспечение безопасности службы Spring Boot с помощью keycloak - токен JWT

Итак, я использую Keycloak для защиты своих услуг. Клиентское приложение получает токен доступа с сервера keycloak и использует его для безопасного доступа к загрузочному приложению Spring. Я настроил свое приложение Spring Boot со свойствами keycloak, используя тип доступа только на носитель:

keycloak.realm = master
keycloak.realmKey = ...
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = boot-app
keycloak.bearer-only = true
keycloak.cors = true

Spring boot keycloak стартер:

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>

И настраиваем KeycloakWebSecurityConfigurerAdapter:

@Configuration
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter
{
  /**
   * Registers the KeycloakAuthenticationProvider with the authentication manager.
   */
  @Autowired
  public void configureGlobal(final AuthenticationManagerBuilder auth) throws Exception
  {
    final KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
    keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
    auth.authenticationProvider(keycloakAuthenticationProvider);
  }

  @Bean
  public KeycloakConfigResolver keycloakConfigResolver()
  {
    return new KeycloakSpringBootConfigResolver();
  }

  /**
   * Defines the session authentication strategy.
   */
  @Bean
  @Override
  protected SessionAuthenticationStrategy sessionAuthenticationStrategy()
  {
    return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
  }

  @Override
  protected void configure(final HttpSecurity http) throws Exception
  {
    super.configure(http);
    http
        .authorizeRequests()
        .antMatchers(
            "/v2/api-docs",
            "/configuration/ui",
            "/swagger-resources",
            "/configuration/security",
            "/swagger-ui.html",
            "/webjars/**",
            "/swagger-resources/configuration/ui",
            "/swagge‌​r-ui.html",
            "/swagger-resources/configuration/security").permitAll()
        .antMatchers("/*").hasRole("user")
        .anyRequest().authenticated();
  }
}

Теперь все работает нормально. Мой вопрос: токен-носитель - это токен JWT, все, что вам нужно для его декодирования (и проверки доступа), - это открытый ключ, который

keycloak.realmKey

Зачем вам нужны другие настройки, а именно:

keycloak.auth-server-url

Разве открытый ключ не все, что вам нужно?

заранее спасибо


person nejckorasa    schedule 08.08.2017    source источник


Ответы (2)


Действительно, для bearer-only вы можете задаться вопросом, зачем нужен URL-адрес KC, но, поскольку в некоторых версиях KC realmKey больше не является обязательным, поскольку мы используем ротацию ключей. Это означает, что ваше приложение будет динамически получать открытый ключ с сервера KC, используя свойство auth-server-url.

person Sébastien Blanc    schedule 08.08.2017
comment
Спасибо за объяснение. Вы знаете, где я могу найти документацию по этому поводу? А может об интеграции с Spring boot. I Документация на официальном сайте keycloak довольно минимальна. - person nejckorasa; 09.08.2017
comment
Вы проверили общую java-документацию об адаптерах OIDC keycloak.gitbooks.io/documentation/securing_apps/topics/oidc/? О Spring Boot, чего вам не хватает? Может быть, мой блог поможет developers.redhat.com/blog/2017/05/25/? - person Sébastien Blanc; 09.08.2017
comment
Не знаю, как я этого не увидел ... Спасибо за ссылки! - person nejckorasa; 10.08.2017

Если у вас есть приложение с весенней загрузкой, последняя версия Spring-Security справится с этим аккуратно. Все, что вам нужно, это определить jwks-uri в свойствах приложения и необходимых зависимостях.

spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8780/auth/realms/my-realm/protocol/openid-connect/certs

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-resource-server</artifactId>
        <version>5.3.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
        <version>5.3.3.RELEASE</version>
    </dependency>

Обратите внимание, что вы также можете использовать uri эмитента вместо jwks, если хотите

spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8780/auth/realms/my-realm
person Winster    schedule 19.07.2020