繁体   English   中英

Azure AD和Spring Security with Oauth 2

[英]Azure AD and Spring Security with Oauth 2

我们正在尝试使用Azure AD和Spring安全性来实现SSO方案。 我们找到了一些线索:

https://github.com/spring-guides/tut-spring-boot-oauth2

https://github.com/Pytry/azure-b2c-oauth2

但这些都不能讲述完整的故事。 实际上我们无法通过访问令牌解析,Spring对JWT令牌应该是什么有不同的想法。

理想情况下,我们不希望从头开始编写SSO过滤器,但会覆盖令牌服务,以便为初学者实现自定义过滤。

有没有人成功实现过这个? 任何帮助,将不胜感激。

更新:我发现了一种更简单的方法。 只需在userAuthorizationUri之后添加一个资源参数。

security:
  oauth2:
    client:
      ...
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize?resource=https://graph.windows.net
      ...

https://stackoverflow.com/a/45828135/2231168


原始答案

在我的办公室,我们找到了一篇外国博客文章,引导我们最终实施http://statemachine.hatenablog.com/entry/2016/04/19/155920

作为一种解决方法,您必须添加两个类来捕获OAuth2RestTemplate和请求增强器。 它适用于包含弹簧4.2.8的弹簧启动1.3.8,我们无法使其适用于更高版本。

application.yml:

azure:
  resource: https://graph.windows.net
security:
  oauth2:
    client:
      clientId: <<your client id>>
      clientSecret: <<your client secret>>
      accessTokenUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/token
      userAuthorizationUri: https://login.microsoftonline.com/<<tenantId>>/oauth2/authorize
      clientAuthenticationScheme: form
      scope: openid
    resource:
      userInfoUri: https://graph.windows.net/me?api-version=1.6

AzureRequestEnhancer:

@Component
public class AzureRequestEnhancer implements RequestEnhancer {
    @Value("${azure.resource:null}")
    private String aadResource;

    @Override
    public void enhance(AccessTokenRequest request, OAuth2ProtectedResourceDetails resource, MultiValueMap<String, String> form, HttpHeaders headers) {
        if (!StringUtils.isEmpty(resource)) {
            form.set("resource", aadResource);
        }
    }
}

AzureRequestEnhancerCustomizer:

@Component
public class AzureRequestEnhancerCustomizer {
    @Autowired
    private OAuth2RestTemplate userInfoRestTemplate;

    @Autowired
    private AzureRequestEnhancer azureRequestEnhancer;

    @PostConstruct
    public void testWiring() {
        AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider();
        authorizationCodeAccessTokenProvider.setTokenRequestEnhancer(azureRequestEnhancer);
        userInfoRestTemplate.setAccessTokenProvider(authorizationCodeAccessTokenProvider);
    }
}

PostConstruct注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。

我希望这可以帮助您实施。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM