[SPRING] oauth2 OAuth2AccessToken 요청에 대한 프록시 설정 방법 또는 OAuth2AccessTokenSupport restTemplate 변수를 재정의하는 방법?
SPRINGoauth2 OAuth2AccessToken 요청에 대한 프록시 설정 방법 또는 OAuth2AccessTokenSupport restTemplate 변수를 재정의하는 방법?
나는 다음과 같은 방법으로 네트워크 프록시를 설정하려했지만, 아무 것도 작동하지 않았다.
1 : jvm 변수를 -Dhttp.proxyHost = -Dhttp.proxyPort = .......와 같이 설정하십시오. 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 클라이언트 애플리케이션에서 나머지 템플릿에 대한 프록시를 재정의하거나 설정하도록 도와주세요.
해결법
-
==============================
1.이것은 간단한 해결책이 아닐 수도 있습니다. 그러나 마침내 아래 코드에 의해 oauth 요청에 대한 프록시를 설정할 수있었습니다.
이것은 간단한 해결책이 아닐 수도 있습니다. 그러나 마침내 아래 코드에 의해 oauth 요청에 대한 프록시를 설정할 수있었습니다.
필터 등록
@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; } }
-
==============================
2.이 작업을 수행하는 또 다른 방법은 OAuth2RestTemplate에 사용자 지정 AccessTokenProvider를 설정하는 것입니다. 아래 코드 샘플에서는 SSL 유효성 검사가 무시됩니다.
이 작업을 수행하는 또 다른 방법은 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; } }
from https://stackoverflow.com/questions/37854133/how-to-set-proxy-on-spring-oauth2-oauth2accesstoken-request-or-how-to-override-o by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Docker Swarm 및 Kubernetes와 같은 Spring Cloud와 Orchestration 도구의 결합 (0) | 2019.02.16 |
---|---|
[SPRING] 어떤 유형의 자바 생성자가 이것입니까? 생성자 연결? (0) | 2019.02.16 |
[SPRING] UserDetails의 사용자 지정 구현 예제 (0) | 2019.02.16 |
[SPRING] 싱글 사인온 + 봄 [마감] (0) | 2019.02.16 |
[SPRING] 봄 보안 - 휴식 서비스에서 일반 양식 대신 json으로 자격 증명을 전송합니다. (0) | 2019.02.16 |