Рубрики
Без рубрики

OAuth2 – @EnableResourceServer vs @EnableOAuth2Sso

Узнайте, как настроить клиент OAuth2 и сервер ресурсов с помощью аннотаций Spring @EnableResourceServer и @EnableOAuth2Sso.

Автор оригинала: Daniel Barrigas.

1. Обзор

В этом уроке мы поговорим об аннотациях @EnableResourceServer и @EnableOAuth2Sso в Spring Security.

Мы начнем с объяснения различий между OAuth2 Клиентом и сервером ресурсов OAuth2 |. После этого мы немного поговорим о том, что эти аннотации могут сделать для нас, и продемонстрируем их использование на примере использования Zuul и простого API.

Для целей этой статьи мы собираемся предположить некоторый ранее существовавший опыт работы с Zuul и OAuth2 .

Если у вас их нет или вы считаете, что обзор любого из них был бы полезен, пожалуйста, ознакомьтесь с нашим кратким обзором Zuul и нашим руководством по OAuth2 .

2. Клиент OAuth2 и сервер ресурсов

Есть четыре различных роли в OAuth2, которые мы должны рассмотреть:

  • Владелец ресурса — организация, которая может предоставить доступ к своим защищенным ресурсам
  • Сервер авторизации — предоставляет токены доступа Клиенты после успешной аутентификации Ресурс |/Владельцы и получения их авторизации Сервер ресурсов
  • — компонент, которому требуется маркер доступа, чтобы разрешить или, по крайней мере, рассмотреть возможность доступа к его ресурсам Клиент
  • — объект, способный получать токены доступа с серверов авторизации

Аннотируя наш класс конфигурации с помощью @EnableResourceServer или @EnableOAuth2Sso , Spring дает указание настроить компоненты , которые преобразуют наше приложение в одну из двух последних ролей, упомянутых выше.

Аннотация @EnableResourceServer позволяет нашему приложению вести себя как Сервер ресурсов путем настройки OAuth2AuthenticationProcessingFilter и другие не менее важные компоненты .

Проверьте класс ResourceServerSecurityConfigurer , чтобы получить лучшее представление о том, что настраивается за кулисами.

И наоборот, аннотация @EnableOAuth2Sso превращает наше приложение в клиент OAuth2 . Он инструктирует Spring настроить OAuth2ClientAuthenticationProcessingFilter , а также другие компоненты, необходимые нашему приложению для получения токенов доступа с сервера авторизации.

Взгляните на класс SsoSecurityConfigurer для получения более подробной информации о том, что Spring настраивает для нас.

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

  • Нашим первым приложением будет наш пограничный узел, простое Zuul приложение, которое будет использовать @EnableOAuth2Sso аннотацию. Он будет отвечать за аутентификацию пользователей (с помощью Авторизации | Сервера ) и делегирование входящих запросов другим приложениям Второе приложение будет использовать аннотацию
  • @EnableResourceServer и разрешит доступ к защищенным ресурсам, если входящие запросы содержат действительный токен доступа OAuth2

3. Zuul – @EnableOAuth2Sso

Давайте начнем с создания приложения Zuul , которое будет действовать в качестве нашего пограничного узла и будет отвечать за аутентификацию пользователей с помощью OAuth2 Авторизации | Сервера :

@Configuration
@EnableZuulProxy
@EnableOAuth2Sso
@Order(value = 0)
public class AppConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private ResourceServerTokenServices 
      resourceServerTokenServices;

    @Override
    public void configure(HttpSecurity http) throws Exception { 
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/authorization-server-1/**",
              "/login").permitAll()
            .anyRequest().authenticated().and()
            .logout().permitAll().logoutSuccessUrl("/");
    }
}

Аннотирование нашего Zuul приложения с помощью @EnableOAuth2Sso также уведомляет Spring о настройке Фильтр реле токенов OAuth2 фильтр. Этот фильтр извлекает ранее полученные токены доступа из HTTP-сеансов пользователей и распространяет их по потоку.

Обратите внимание, что мы также используем аннотацию @Order в нашем классе Конфигурация приложения конфигурация. Это делается для того, чтобы убедиться, что Фильтры , созданные нашим WebSecurityConfigurerAdapter , имеют приоритет над Фильтрами , созданными другими WebSecurityConfigurerAdapters .

Например, мы могли бы аннотировать ваше приложение Zuul с помощью @EnableResourceServer для поддержки идентификаторов сеансов HTTP и токенов доступа OAuth2. Однако при этом создаются новые Фильтры , которые по умолчанию имеют приоритет над фильтрами, созданными классом AppConfiguration|/. Это происходит потому , что ResouceServerConfiguration , класс конфигурации, инициируемый @EnableResourceServer , задает порядок по умолчанию 3, в то время как WebSecurityConfigureAdapter имеет порядок по умолчанию 100.

Прежде чем мы перейдем на наш Ресурс Сервер, нам нужно настроить некоторые свойства:

zuul:
  routes:
    resource-server-mvc-1: /resource-server-mvc-1/**
    authorization-server-1:
      sensitiveHeaders: Authorization
      path: /authorization-server-1/**
      stripPrefix: false
  add-proxy-headers: true

security:
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: http://localhost:8769/authorization-server-1/oauth/token
      userAuthorizationUri: /authorization-server-1/oauth/authorize
      clientId: fooClient
      clientSecret: fooSecret
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      serviceId: ${PREFIX:}resource

Не вдаваясь в подробности, используя эту конфигурацию, мы:

  • Настройка наших маршрутов Zuul и указание, какие заголовки следует добавить/удалить перед отправкой запросов вниз по течению.
  • Настройка некоторых свойств OAuth2 для нашего приложения, чтобы оно могло взаимодействовать с нашим Авторизацией | Сервером и настройка JWT с симметричным шифрованием.

4. API – @EnableResourceServer

Теперь, когда у нас есть наше приложение Zuul , давайте создадим наш Ресурс | Сервер :

@SpringBootApplication
@EnableResourceServer
@Controller
@RequestMapping("/")
class ResourceServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ResourceServerApplication.class, args);
    }

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public String helloWorld(Principal principal) {
        return "Hello " + principal.getName();
    }
}

Это простое приложение, которое предоставляет одну конечную точку для возврата имени Участника , инициировавшего запрос.

Давайте завершим, настроив некоторые свойства:

security:
  basic:
    enabled: false
  oauth2:
    resource:
      jwt:
        keyValue: "abc"
      id: fooScope
      service-id: ${PREFIX:}resource

Имейте в виду, что нам нужен действительный токен доступа (который хранится в HttpSession пользователя в нашем пограничном узле) для доступа к конечной точке нашего Ресурса | Сервера .

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

В этой статье мы объяснили различия между @EnableOAuth2Sso и @EnableResourceServer аннотациями. Мы также продемонстрировали, как их использовать на практическом примере с использованием Zuul и простого API.

Полную реализацию этого примера можно найти на Github .

При локальном запуске мы можем запустить и протестировать приложение по адресу http://192.168.1.67:8765/resource-server-mvc-1