2

は、私は、次の方法でネットワークプロキシを設定しようとしましたが、この方法のどれも春にoauth2 OAuth2AccessTokenリクエストでプロキシを設定する方法、またはOAuth2AccessTokenSupport restTemplate変数をオーバーライドする方法

1を作業していないます。-Dhttp.proxyHost = -Dhttp.proxyPort =のようにJVM変数を設定する.......
2:豆を作りました。

@Bean 
public RestTemplate restTemplate() { 
    final String proxyHost = "######"; // host 
    final int proxyPort = ####; // port 
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); 
    factory.setProxy(new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, proxyPort))); 
    return new RestTemplate(factory); 
} 

ただし、この構成は、OAuth2AccessTokenSupport.restTemplateによってオーバーライドされます。

したがって、以下のメソッドは、常に新しく作成された残りのテンプレートオブジェクトを返します。

org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport

protected RestOperations getRestTemplate() { 
    if (restTemplate == null) { 
     synchronized (this) { 
      if (restTemplate == null) { 
       RestTemplate restTemplate = new RestTemplate(); 
       restTemplate.setErrorHandler(getResponseErrorHandler()); 
       restTemplate.setRequestFactory(requestFactory); 
       restTemplate.setInterceptors(interceptors); 
       this.restTemplate = restTemplate; 
      } 
     } 
    } 
    if (messageConverters == null) { 
     setMessageConverters(new RestTemplate().getMessageConverters()); 
    } 
    return restTemplate; 
} 

親切に私はOAuthクライアントアプリケーションから残りのテンプレートにプロキシを無効にしたり、設定したりするのに役立ちます。

+0

提案がありますか? – Karthikeyan

答えて

1

これは簡単な解決策ではないかもしれません。しかし、最終的には、以下のコードでoauthリクエストにプロキシを設定することができました。

これを実行する別の方法は、あなたのOAuth2RestTemplateにカスタムAccessTokenProviderを設定することであるフィルタ

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    // @formatter:off 
    http.antMatcher("/**") 
    .authorizeRequests().antMatchers("/webjars/**", "/scripts/**", "/styles/**", "/instances/**", "/#/invalid").permitAll() 
    .anyRequest().authenticated() 
    .and().csrf().csrfTokenRepository(csrfTokenRepository()) 
    .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class) 
    .addFilterBefore(oauthFilter(), BasicAuthenticationFilter.class); 
    // @formatter:on 
    super.configure(http); 
} 

認証フィルタ

@Autowired 
OAuth2ClientContext oauth2ClientContext; 

@Autowired 
OAuth2ProtectedResourceDetails resource; 

@Autowired 
ResourceServerProperties resourceServer; 

@Autowired 
RequestHelper requestHelper; 

private Filter oauthFilter() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { 
    OAuth2ClientAuthenticationProcessingFilter oauthFilter = new OAuth2ClientAuthenticationProcessingFilter("/login"); 
    OAuth2RestTemplate oauthTemplate = new OAuth2RestTemplate(resource, oauth2ClientContext); 
    OAuth2AccessTokenSupport authAccessProvider = new AuthorizationCodeAccessTokenProvider(); 
    // Set request factory for '/oauth/token' 
    authAccessProvider.setRequestFactory(requestHelper.getRequestFactory()); 
    AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
      (AuthorizationCodeAccessTokenProvider)authAccessProvider)); 
    oauthTemplate.setAccessTokenProvider(accessTokenProvider); 
    // Set request factory for '/userinfo' 
    oauthTemplate.setRequestFactory(requestHelper.getRequestFactory()); 
    oauthFilter.setRestTemplate(oauthTemplate); 
    UserInfoTokenServices userInfoTokenService = new UserInfoTokenServices(resourceServer.getUserInfoUri(), resource.getClientId()); 
    userInfoTokenService.setRestTemplate(oauthTemplate); 
    oauthFilter.setTokenServices(userInfoTokenService); 
    return oauthFilter; 
} 

要求ヘルパーコード

@Configuration 
public class RequestHelper { 

    @Value("${proxy.hostname}") 
    private String proxyHost; 

    @Value("${proxy.port}") 
    private int proxyPort; 

    @Value("${proxy.username}") 
    private String proxyUser; 

    @Value("${proxy.password}") 
    private String proxyPassword; 

    @Value("${useProxy}") 
    private boolean useProxyFlag; 

    @Value("${skipSslValidation}") 
    private Boolean skipSslValidationFlag; 

    public HttpComponentsClientHttpRequestFactory getRequestFactory() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { 

     HttpClientBuilder httpClientBuilder = HttpClients.custom(); 

     // Skip SSL validation based on condition 
     if (skipSslValidationFlag) { 
      TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; 

      SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() 
        .loadTrustMaterial(null, acceptingTrustStrategy) 
        .build(); 
      SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); 

      httpClientBuilder = httpClientBuilder.setSSLSocketFactory(csf); 
     } 

     // Set proxy based on condition 
     if (useProxyFlag) { 
      CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
      credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyUser, proxyPassword)); 
      httpClientBuilder = httpClientBuilder.setProxy(new HttpHost(proxyHost, proxyPort)); 
      httpClientBuilder = httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); 
     } 

     CloseableHttpClient httpClient = httpClientBuilder.build(); 
     HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); 
     requestFactory.setHttpClient(httpClient); 
     return requestFactory; 
    } 
} 
0

を登録します。次のコードサンプルでは、​​SSL検証がバイパスされています。

@Configuration 
public class ConfigLocal { 

    @Value("${https.proxyHost}") 
    private String proxyHost; 

    @Value("${https.proxyPort}") 
    private Integer proxyPort; 

    @Value("${https.proxyUser}") 
    private String proxyUser; 

    @Value("${https.proxyPassword}") 
    private String proxyPassword; 

    @Bean 
    public OAuth2RestTemplate oauth2RestTemplate(ClientCredentialsResourceDetails clientCredentialsResourceDetails) 
      throws KeyManagementException, KeyStoreException, NoSuchAlgorithmException { 
     OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(clientCredentialsResourceDetails); 

     // Instanciate a new http client with proxy configuration, and bypass SSL Certificate verification 
     CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
     credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxyUser, proxyPassword)); 

     HttpClientBuilder httpClientBuilder = 
       HttpClients.custom() 
         .setProxy(new HttpHost(proxyHost, proxyPort)) 
         .setDefaultCredentialsProvider(credentialsProvider) 
         .setSSLHostnameVerifier(new NoopHostnameVerifier()) 
          .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true) 
            .build()); 

     // requestFactory 
     HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()); 
     ClientCredentialsAccessTokenProvider clientCredentialsAccessTokenProvider = new ClientCredentialsAccessTokenProvider(); 
     clientCredentialsAccessTokenProvider.setRequestFactory(requestFactory); 

     // accessTokenProvider 
     AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
       new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(), 
       new ResourceOwnerPasswordAccessTokenProvider(), clientCredentialsAccessTokenProvider)); 

     restTemplate.setAccessTokenProvider(accessTokenProvider); 

     return restTemplate; 
    } 
} 
関連する問題