Статьи

Приложения Spring Boot 2 и OAuth 2 — устаревший подход

Эта статья является второй частью серии из трех статей, в которых рассматриваются способы включения единого входа с поставщиком OAuth2 для приложений на основе Spring Boot 2. 3 сообщения:

1. Способы начальной загрузки OpenID Connect-совместимого сервера авторизации OAuth2 / провайдера OpenID

2. Устаревший подход Spring Boot / Spring 5 к интеграции с сервером авторизации OAuth2 / провайдером OpenID — этот пост

3. Более новый подход Spring Boot 2 / Spring 5 к интеграции с сервером авторизации OAuth2 / провайдером OpenID Connect — скоро

В этом посте будет рассмотрен устаревший подход Spring Boot 2 / Spring Security 5 к включению механизма аутентификации на основе OAuth2 для приложения, в этом посте предполагается, что все
шаги в предыдущем сообщении в блоге были выполнены, и UAA запущен и работает.

Вероятно, возникает вопрос: почему я говорю о наследии в контексте Spring Boot 2 / Spring Security 5, когда это должен был быть новый способ создания единого входа! Причина в том, что, поскольку разработчики использовали подход с Spring Boot 1.5.x, который сейчас считается устаревшим, в нем есть функции, которые не полностью перенесены на новый подход (возможность раскрутить сервер авторизации OAuth2). и возможность создания сервера ресурсов OAuth2 являются примерами), тем временем разработчики Spring Security (спасибо
Rob Winch & Joe Grandja ) обеспечил мост к устаревшему подходу в форме проекта spring-security-oauth2-boot .

Подход

Итак, как выглядит унаследованный подход — я уже подробно описывал его здесь , чтобы подвести итог, он работает на основе аннотации @ EnableOAuth2SSO и набора свойств, поддерживающих эту аннотацию, пример конфигурации безопасности выглядит следующим образом —

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
@EnableOAuth2Sso
@Configuration
public class OAuth2SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
 
        web.ignoring()
           .mvcMatchers("/favicon.ico", "/webjars/**", "/css/**");
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
 
        http.authorizeRequests()
                .antMatchers("/secured/**")
                    .authenticated()
                .antMatchers("/")
                    .permitAll()
                .anyRequest()
                    .authenticated();
    }
 
}

и набор поддерживающих свойств, указывающих на UAA, следующий:

01
02
03
04
05
06
07
08
09
10
11
12
13
ssoServiceUrl: http://localhost:8080/uaa
 
security:
  oauth2:
    client:
      client-id: client1
      client-secret: client1
      access-token-uri: ${ssoServiceUrl}/oauth/token
      user-authorization-uri: ${ssoServiceUrl}/oauth/authorize
    resource:
      jwt:
        key-uri: ${ssoServiceUrl}/token_key
      user-info-uri: ${ssoServiceUrl}/userinfo

С проектом spring-security-oauth2-boot в качестве зависимости:

1
2
compile 'org.springframework.cloud:spring-cloud-starter-oauth2'
compile("org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.0.BUILD-SNAPSHOT")

эти аннотации работают только для приложения Spring Boo2. Однако обратите внимание, что Spring Boot 2 поддерживает две различные веб-структуры — Spring Web и Spring Webflux. Этот подход транзитивно использует Spring Web, что делает Spring Web средой по умолчанию .

Полный пример с способами его запуска доступен в моем репозитории github здесь — https://github.com/bijukunjummen/oauth2-boot2

тестирование

Любой URI, начинающийся с «/ secured / **», активируется с помощью единого входа, если доступ к странице индекса осуществляется без проверки подлинности:

Теперь нажатие на URI, начинающееся с «/ secured / **», должно запустить поток кода авторизации OAuth2:

и должен предоставить пользователю экран входа в систему через UAA:

Войдите в систему с учетными данными, которые были созданы ранее — user1 / user1 должен перенаправить пользователя обратно в унаследованную версию Spring Boot 2 и отобразить защищенную страницу:

Это завершает унаследованный подход к SSO с Spring Boot 2. Обратите внимание, что это просто псевдо-аутентификация, OAuth2 предназначен больше для авторизации доступа к ресурсу пользователя, чем для аутентификации, как он используется здесь. Статья, которая разъясняет это, доступна здесь . В следующем посте с родным Spring Security 5 / Spring Boot2 будет представлен более понятный механизм аутентификации с использованием OpenID Connect.

См. Оригинальную статью здесь: Spring Boot 2 Applications и OAuth 2 — устаревший подход

Мнения, высказанные участниками Java Code Geeks, являются их собственными.