Как использовать Spring Boot oAuth2 + Azure AD в микросервисе без сохранения состояния? - PullRequest
0 голосов
/ 07 ноября 2018

Когда я пытаюсь использовать пример кода из Microsoft Azure для использования oAuth2 и Spring Boot, он использует сеанс с состоянием для проверки подлинности / авторизации. Вы можете видеть это в этом:

  1. Он никогда не пропускает никаких заголовков / JWT при любых вызовах
  2. У него есть файл cookie "JSESSIONID", который вы можете использовать в новом сеансе почтальона (после получения его в другом браузере), и он будет считать, что вы вошли в систему

Это не будет работать, поскольку наши микро-сервисы будут иметь несколько экземпляров.

Как я могу преобразовать это, чтобы использовать JWT (Authorization: Bearer AQab...) для последующих вызовов вместо cookie?

Зависимости:

//All using Spring Boot 2.0.5.RELEASE
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.security:spring-security-oauth2-client')
compile('org.springframework.security:spring-security-oauth2-jose')

//Using 2.0.7
compile('com.microsoft.azure:azure-active-directory-spring-boot-starter')

Config:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;

@EnableWebSecurity
@EnableGlobalMethodSecurity( prePostEnabled = true )
public class OAuthConfig extends WebSecurityConfigurerAdapter
{
    @Autowired
    private OAuth2UserService<OidcUserRequest, OidcUser> userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .oauth2Login()
            .userInfoEndpoint()
            .oidcUserService( userService );
    }
}

Контроллер:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController
{
    private OAuth2AuthorizedClientService clientService;

    @Autowired
    public MainController(OAuth2AuthorizedClientService clientService)
    {
        this.clientService = clientService;
    }

    @GetMapping( "checkrole" )
    @ResponseBody
    @PreAuthorize( "hasRole('ROLE__Test')" )
    public String group1()
    {
        return "ok";
    }

    @GetMapping( "/" )
    @ResponseBody
    public String getUser(OAuth2AuthenticationToken userToken)
    {
        //Printing out the oAuth token just for testing
        return clientService.loadAuthorizedClient(
            userToken.getAuthorizedClientRegistrationId(),
            userToken.getName()
        ).getAccessToken().getTokenValue();
    }
}

application.yml:

spring:
  security:
    oauth2:
      client:
        registration:
          azure:
            client-id: ${YOUR_CLIENT_ID:}
            client-secret: ${YOUR_CLIENT_SECRET:}

azure:
  activedirectory:
    tenant-id: ${YOUR_TENANT_OR_DIRECTORY_ID:}
    active-directory-groups: Test

Полный пример кода

https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-backend-sample

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...