Первые шаги во фреймворке Spring

6a7f970a021f49a5bf5b479bcd1f1c14.png

В сентябре этого года группа наших разработчиков посетила Java-конференцию SpringOne2GX, проходившую в Вашингтоне. Это одна из крупнейших подобных конференций, и мы не могли пройти мимо. Предлагаем вашему вниманию рассказ о том, что полезного и интересного мы вынесли для себя по результатам этой конференции.
Фреймворк Spring предоставляет программисту отличные средства для разработки приложений, в нем есть практически все, что может понадобиться. Более того, сегодня Spring задает вектор дальнейшего развития всей индустрии. Spring boot и микросервисы — тому пример.

В этой статье мы покажем, как просто с помощью Spring можно создать свой микросервис, использующий OAuth 2.0 и OpenID Connect для аутентификации в Google и получения информации о пользователе, дающем микросервису права на выполнение какой-то задачи от его имени. Ради упрощения, здесь будет приведен пример только с аутентификацией и просмотром информации о пользователе, а всё остальное, включая теорию по OAuth и OpenID Connect, будет опущено. Итак, начнем.

Для начала создадим проект. Проще всего использовать Spring Initializer, в нашем примере просто указано название проекта и необходимые модули. Вот и готово приложение Spring Boot c мавен-файлом, подключающим все необходимые зависимости создано автоматически.

Далее нам понадобится аннотация @EnableOAuth2Sso. Согласно документации, она позволяет создать точку аутентификации single sign on, при этом сама будет читать параметры конфигурации. Поскольку в этом примере создается web-приложение, мы расширяем стандартный WebSecurityConfigurerAdapter . Вот как он выглядит:

   @EnableOAuth2Sso
   public static class LoginConfigurer extends WebSecurityConfigurerAdapter {
       @Override
       public void configure(HttpSecurity http) throws Exception {
           http.antMatcher("/main/**").authorizeRequests().anyRequest()
             .authenticated();
       }
   }


Здесь main — это restfull root для нашего приложения, все запросы к нему должны быть аутентифицированы. Теперь займемся конфигурацией для аутентификации с помощью сервисов Google. Для этого нам понадобится создать свой secret code и связать его со своим client id у провайдера. Это можно сделать здесь: https://console.developers.google.com

Вот как выглядит окно создания своего Client ID:

9ca6668bc3994664a946bbc4b7765a41.png

Выбираем Web application, указываем название приложения и точку редиректа после успешной аутентификации, и появляется такое окно:

a3a4537afaca413b8d37b940985a5c2d.png

Там, где указаны my client ID и my client secret, вы увидите свой собственный ID и secret. Далее создаем конфигурацию:

spring:
 profiles: google
security:
 oauth2:
   client:
     clientId: my client ID.apps.googleusercontent.com
     clientSecret: my client secret
     accessTokenUri: https://accounts.google.com/o/oauth2/token
     userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
     scope: openid profile
   resource:
     jwt.keyUri:
     userInfoUri: https://www.googleapis.com/oauth2/v3/userinfo


Обратите внимание, что в scope указано не только openid, но еще и profile — это позволит при логине указать, к чему конкретно будет даваться доступ приложению. Так как у google много различных сервисов, то мы можем давать доступ и к этим сервсам просто добавив их в конфигурацию.

Чтобы показать данные пользователя, от имени которого будет осуществляться работа с сервисом, нам достаточно получить информацию из Principal. Проще всего это сделать так:

   @RequestMapping("/user")
   public Principal user(Principal user) {
       return user;
   }


А теперь, собираем всё в кучу. Ниже приведен скриншот приложения в IDE и листинги всех файлов:

1bfb96cff34e4a2cabbb1514ac33dabc.png

Приложение:

package com.nix;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;

@Configuration
@ComponentScan
@EnableAutoConfiguration
@RestController
@RequestMapping("/main")
public class SsoOpenIdConnectApplication {
   @RequestMapping("/user")
   public Principal user(Principal user) {
       return user;
   }

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

   @Component
   @EnableOAuth2Sso
   public static class LoginConfigurer extends WebSecurityConfigurerAdapter {
       @Override
       public void configure(HttpSecurity http) throws Exception {
           http.antMatcher("/main/**").authorizeRequests().anyRequest()
             .authenticated();
       }
   }
}


Конфигурация к нему (application.yml). При запуске конфигурации в Spring Boot не забудьте указать «google» в качестве активного профиля:

server:
 port: 9999

security:
 ignored: /,/favicon.ico,/index.html
 sessions: ALWAYS
 oauth2:
   sso:
     loginPath: /main/login

---
spring:
 profiles: google
security:
 oauth2:
   client:
     clientId: my client ID.apps.googleusercontent.com
     clientSecret: my client secret
     accessTokenUri: https://accounts.google.com/o/oauth2/token
     userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
     scope: openid profile
   resource:
     jwt.keyUri:
     userInfoUri: https://www.googleapis.com/oauth2/v3/userinfo


Ну и index.html:



    
    


    
login

 

Вот так будет выглядеть аутентификация вашего приложения при запуске:

9528ab2c18964efba7e71d472db6419b.png

В результате всех вышеописанных действий, мы получили способное работать в облаке приложение с single sign on, использующее Google в качестве провайдера для OpenID Connect. При желании можно создать множество других микросервисов, аналогично настроенных и использующих тот же single sign on. Тот факт, что вся настройка на Google лежит в конфигурациях, позволяет очень быстро переключиться на другого провайдера. И несмотря на кажущуюся сложность настройки SSO, данное решение является столь же простым, как и basic authentication.

© Habrahabr.ru