[英]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.