Статьи

Родной подход Spring Boot 2 к SSO с OAuth 2 / OpenID Connect

Эта статья является заключительной частью серии из 3 статей, в которой рассматриваются способы включения единого входа с поставщиком 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 с использованием встроенной поддержки OAuth2 в Spring Security.

Пост снова предполагает, что все, что описано в первом посте , завершено.

Spring Boot 2 Автоконфигурация

Spring Boot 2 предоставляет автоконфигурацию для встроенной поддержки OAuth2 в Spring Security (см. Класс org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration ).

Автоконфигурация активируется наличием библиотеки «spring-security-oauth2-client», доступной через следующие координаты gradle:

1
compile "org.springframework.security:spring-security-oauth2-client"

Эта автоконфигурация работает с набором свойств, для провайдера идентификации UAA, который был запущен, набор свойств является следующим:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
uaa-base-url: http://localhost:8080/uaa
 
spring:
  security:
    oauth2:
      client:
        registration:
          uaa:
            client-id: client1
            client-secret: client1
            authorizationGrantType: authorization_code
            redirect_uri_template: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope: resource.read,resource.write,openid,profile
            clientName: oauth2-sample-client
        provider:
          uaa:
            token-uri: ${uaa-base-url}/oauth/token
            authorization-uri: ${uaa-base-url}/oauth/authorize
            user-info-uri: ${uaa-base-url}/userinfo
            jwk-set-uri: ${uaa-base-url}/token_keys
            userNameAttribute: user_name

Если бы я зависел от поддержки автоконфигурации Spring Boot 2 для собственной поддержки OAuth2, и я должен был запустить приложение, мне бы представили эту страницу при доступе к приложению:

Обратите внимание, что эта страница входа является страницей по умолчанию, созданной Spring Security OAuth2 и по умолчанию представляет список регистраций.

Нажав на «oauth2-sample-client», вы увидите страницу входа в систему провайдера идентификации, UAA, в следующем примере:

Для потока на основе OpenID Connect приложениям выдается токен ID вместе с токеном доступа, который я декодирую и представляю на странице:

Адаптации

Одна из быстрых настроек, которые я хочу сделать, — это перенаправление в UAA при доступе к любой защищенной странице, указанной с помощью шаблона «/ secure» uri. Ниже приведен набор конфигурации, который должен включить это:

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
32
33
34
package sample.oauth2.config
 
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
 
@Configuration
class OAuth2SecurityConfig : WebSecurityConfigurerAdapter() {
    override fun configure(web: WebSecurity) {
        super.configure(web)
        web.ignoring()
                .mvcMatchers(
                        "/favicon.ico",
                        "/webjars/**",
                        "/css/**"
                )
    }
 
    override fun configure(http: HttpSecurity) {
        http.csrf().disable()
 
        http.authorizeRequests()
                .antMatchers("/secured/**")
                    .authenticated()
                .antMatchers("/", "/custom_login")
                    .permitAll()
                .anyRequest()
                    .authenticated()
                .and()
                    .oauth2Login()
                    .loginPage("/custom_login")
    }
}

См. «/ Custom_login», устанавливаемый как URI выше, который, в свою очередь, просто передает управление контролируемым OAuth2 конечным точкам, которые знают, как установить соответствующие параметры и перенаправить на UAA:

1
2
3
4
5
6
7
8
@Controller
class LoginController {
 
    @RequestMapping("/custom_login")
    fun loginPage(): String {
        return "redirect:/oauth2/authorization/uaa"
    }
}

На этом мы завершаем исследование встроенной поддержки OAuth2 в приложениях Spring Boo2.

Все образцы доступны в моем репозитории githubhttps://github.com/bijukunjummen/oauth2-boot2

Следующие ссылки были полезны для понимания поддержки OAuth2:

1. Документация Spring Securityhttps://docs.spring.io/spring-security/site/docs/current/reference/html/

2. Презентация Джо Гранджи на Spring One Platform 2017https://www.youtube.com/watch?v=WhrOCurxFWU

См. Оригинальную статью здесь: Spring Boot 2 нативный подход к SSO с OAuth 2 / OpenID Connect

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