java—在不允许getenv调用的受保护环境中创建amazonhttpclient

fykwrbwg  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(409)

从aws sdk的1.11.700版切换到1.11.908版,我们的一个库现在无法在受保护的环境中工作。更具体地说,新的sdk版本已经更改了clientconfiguration,因此它现在通过检查env vars来示例化retrypolicy。
不幸的是,我们将把这个库部署到一个禁止(securitymanager就地)访问env变量的环境中。这意味着所有依赖于amazonhttpclient的代码都不再可用,因为:
为了示例化 AmazonHttpClient 你必须通过一个有效的 ClientConfiguration (不接受null)
为了创建一个有效的 ClientConfiguration 你需要能够阅读环境变量
以下是堆栈跟踪:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.AWS_RETRY_MODE")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:886)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.boomi.security.ExtendedSecurityManager.checkPermissionImpl(ExtendedSecurityManager.java:207)
    at com.boomi.security.ExtendedSecurityManager.checkPermission(ExtendedSecurityManager.java:114)
    at java.lang.System.getenv(System.java:894)
    at com.amazonaws.retry.internal.RetryModeResolver.envVar(RetryModeResolver.java:67)
    at com.amazonaws.retry.internal.RetryModeResolver.resolveRetryMode(RetryModeResolver.java:72)
    at com.amazonaws.retry.internal.RetryModeResolver.<init>(RetryModeResolver.java:46)
    at com.amazonaws.retry.RetryPolicy.<clinit>(RetryPolicy.java:35)
    at com.amazonaws.retry.PredefinedRetryPolicies.<clinit>(PredefinedRetryPolicies.java:30)
    at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:89)

我们提出的所有选项都不适用于此场景:
子类化 ClientConfiguration 抑制异常:无法尝试捕获对super()构造函数的调用 ClientConfiguration 是一个类,因此我们没有要实现的接口 java.policy 无法修改以允许访问属性:环境不在我们的控制范围内
异常是从而不是从中抛出的,因此它甚至不与单个对象相关。。。

dfddblmv

dfddblmv1#

看起来amazonhttpclient有一个builder(),所以如果您在builder上设置retrypolicy,客户端配置可能不会查找retrypolicy。
https://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/http/amazonhttpclient.builder.html

hjzp0vay

hjzp0vay2#

------另一种选择:
我们可以在官方的sdk代码中看到,clientconfiguration()构造函数可以采用另一个clientconfiguration,因此可以使用extends创建一个自定义的clientconfiguration。

public class ClientConfigurationByPassingSecurity extends ClientConfiguration{

        @Override
        public RetryPolicy getRetryPolicy(){
           return xx;
        }

   }

//创建amazonhttpclient并传递此自定义

ClientConfiguration customClientConfiguration = new ClientConfigurationByPassingSecurity ();

ClientConfiguration clientConfig = new ClientConfiguration(customClientConfiguration);

new AmazonHttpClient(clientConfig);

重写由于getvars而失败的任何方法。

相关问题