2

I는 다음과 같은 방법으로 네트워크 프록시를 설정하려고했지만 방법 중 어느 것도봄에 프록시를 설정하는 방법 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 요청에 대한 프록시를 설정할 수있었습니다.

@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

에게

@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); 
} 

인증 필터를 필터이 당신의 OAuth2RestTemplate에 사용자 정의 AccessTokenProvider을 설정하는 것입니다 할 수있는 또 다른 방법을 등록합니다. 아래 코드 샘플에서는 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; 
    } 
}