簡體   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