如何在无状态微服务中使用Spring Boot oAuth2 + Azure AD?

时间:2018-11-07 18:54:43

标签: spring azure spring-boot spring-security spring-security-oauth2

当我尝试使用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')

配置:

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

0 个答案:

没有答案