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