Автор оригинала: 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