Введение в Spring Cloud Security

Введение в Spring Cloud Security

1. обзор

Модуль Spring Cloud Security предоставляет функции, связанные с безопасностью на основе токенов в приложениях Spring Boot.

В частности, это упрощает SSO на основе OAuth2 - с поддержкой ретрансляции токенов между серверами ресурсов, а также с настройкой нисходящей аутентификации с использованием встроенного прокси-сервера Zuul.

В этой быстрой статье мы рассмотрим, как мы можем настроить эти функции с помощью клиентского приложения Spring Boot, сервера авторизации и REST API, работающего как сервер ресурсов.

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

2. Быстрый запуск приложения для облачной безопасности

Начнем сconfiguring SSO in a Spring Boot application.

Во-первых, нам нужно добавить зависимостьspring-cloud-starter-oauth2:


    org.springframework.cloud
    spring-cloud-starter-oauth2
    2.2.2.RELEASE

Это также приведет к появлению зависимостиspring-cloud-starter-security.

We can configure any social site as an Auth Server for our site or we can use our own server. In our case, we’ve chosen the latter option and configured an application that acts as an Authorization Server – which is развертывается локально вhttp://localhost:7070/authserver.

Наш сервер авторизации использует токены JWT.

Кроме того, чтобы любой клиент мог получить учетные данные пользователя, нам необходимо настроить наш сервер ресурсов, работающий на порту 9000, с конечной точкой, которая может обслуживать эти учетные данные.

Здесь мы настроили конечную точку /user, которая доступна вhttp://localhost:9000/user.

Для получения дополнительной информации о том, как настроить сервер авторизации и сервер ресурсов, ознакомьтесь с нашимprevious article here.

Теперь мы можем добавить аннотацию в класс конфигурации в нашем клиентском приложении:

@Configuration
@EnableOAuth2Sso
public class SiteSecurityConfigurer
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // ...
    }
}

Any requests that require authentication will be redirected to the Authorization Server. Чтобы это работало, мы также должны определить свойства сервера:

security:
  oauth2:
    client:
      accessTokenUri: http://localhost:7070/authserver/oauth/token
      userAuthorizationUri: http://localhost:7070/authserver/oauth/authorize
      clientId: authserver
      clientSecret: passwordforauthserver
    resource:
      userInfoUri: http://localhost:9000/user

Обратите внимание, что нам нужно иметьspring-boot-starter-security в нашем пути к классам, чтобы указанная выше конфигурация работала.

3. Ретрансляция токенов доступа

При ретрансляции токена клиент OAuth2 перенаправляет полученный им токен OAuth2 на исходящий запрос ресурса.

Поскольку мы объявили аннотацию@EnableOauth2Sso, Spring Boot добавляет bean-компонентOAuth2ClientContext в область запроса. Исходя из этого, мы можем создать собственныеOAuth2RestTemplate в нашем клиентском приложении:

@Bean
public OAuth2RestOperations restOperations(
  OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) {
    return new OAuth2RestTemplate(resource, context);
}

После того, как мы настроили bean-компонент,, контекст перенаправит токен доступа запрошенным службам, а также обновит токен, если срок его действия истечет.

4. Ретрансляция токена OAuth с использованиемRestTemplate

Ранее мы определили bean-компонентrestOperations типаOAuth2RestTemplate в нашем клиентском приложении. В итогеwe can use the getForObject() method of OAuth2RestTemplate to send a request with the necessary tokens to a protected Resource server от нашего клиента.

Во-первых, давайте определим конечную точку, которая требует аутентификации на нашем сервере ресурсов:

@GetMapping("/person")
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public @ResponseBody Person personInfo(){
    return new Person("abir", "Dhaka", "Bangladesh", 29, "Male");
 }

Это простая конечная точка REST, которая возвращает JSON-представление объектаPerson.

Теперьwe can send a request from the Client application using the getForObject() method which will relay the token to the Resource Server:

@Autowired
private RestOperations restOperations;

@GetMapping("/personInfo")
public ModelAndView person() {
    ModelAndView mav = new ModelAndView("personinfo");
    String personResourceUrl = "http://localhost:9000/person";
    mav.addObject("person",
      restOperations.getForObject(personResourceUrl, String.class));

    return mav;
}

5. Настройка Zuul для ретрансляции токенов

Если мы хотим ретранслировать токен нижестоящим службам прокси, мы можем использовать встроенный обратный прокси Spring Cloud Zuul.

Во-первых, нам нужно добавить зависимость Maven для работы с Zuul:


    org.springframework.cloud
    spring-cloud-starter-netflix-zuul

Затем нам нужно добавить аннотацию @EnableZuulProxy в наш класс конфигурации в клиентском приложении:

@Configuration
@EnableOAuth2Sso
@EnableZuulProxy
public class SiteSecurityConfigurer
  extends WebSecurityConfigurerAdapter {
    //...
}

Все, что осталось сделать, это добавить свойства конфигурации Zuul в наш файлapplication.yml:

zuul:
  sensitiveHeaders: Cookie,Set-Cookie
  routes:
    resource:
      path: /api/**
      url: http://localhost:9000
    user:
      path: /user/**
      url: http://localhost:9000/user

Любой запрос, поступающий в конечную точку /api клиентского приложения, будет перенаправлен на URL-адрес сервера ресурсов. Нам также необходимо предоставить URL-адрес конечной точки учетных данных пользователя.

6. Заключение

В этой быстрой статье мы изучили, как использовать Spring Cloud Security с OAuth2 и Zuul для настройки защищенной авторизации и серверов ресурсов, а также как ретранслировать токены OAuth2 между серверами с помощьюOauth2RestTemplate и встроенного Zuul Proxy.

Как всегда доступен кодover on GitHub.