有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Azure AD和带有Oauth 2的Spring安全性

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

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

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

但这些都不能说明全部情况。 事实上,我们无法通过访问令牌解析,Spring对JWT令牌应该是什么有不同的想法

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

有人成功地实现了这一点吗? 任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    更新:我找到了一个更简单的方法。只需在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和请求增强器。它适用于包含spring 4.2.8的spring boot 1.3.8,我们无法使其适用于更高版本

    申请。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注释用于需要在依赖项注入完成后执行以执行任何初始化的方法

    我希望这有助于您的实施