【发布时间】:2016-12-30 15:02:08
【问题描述】:
我正在使用 jasypt 1.9.2 在我的 spring REST 服务的属性文件中加密密码。我已经通过名为 APP_ENCRYTPION_PASSWORD 的服务器启动参数文本框向 Weblogic 添加了一个环境变量,但是 jasypt 没有读取该环境变量。这是错误:
ERROR o.s.web.servlet.DispatcherServlet - Context initialization failed
java.lang.NullPointerException: null
at org .jasypt.encryption.pbe.config.SimplePBEConfig.getPasswordCharArray(SimplePBEConfig.java:434) ~[jasypt-1.9.2.jar:na]
这是服务器启动时记录的 Weblogic 环境变量:
JAVA_OPTIONS= -Dother.vars=xxx -DAPP_ENCRYPTION_PASSWORD=password -Dmore.vars=yyy
我跟踪了 jasypt 代码,似乎 jasypt 没有解析 JAVA_OPTIONS 中的环境变量。我知道这适用于 spring 等其他框架,因为我们在 JAVA_OPTIONS 中有其他环境变量,spring 读取没有问题。
我可以将环境变量添加到 weblogic 的启动脚本(我认为是 setEnv.sh),但这将为所有托管节点添加变量,而不是为我的应用程序部署到的一个集群添加变量。
是否有不同的方法可以在 spring 中配置 jasypt 以获取 JAVA_OPTIONS 中的环境变量?
这是我的弹簧配置:
<bean
class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg>
<bean class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config">
<bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndTripleDES" />
<property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />
</bean>
</property>
</bean>
</constructor-arg>
<property name="location">
<value>application.properties
</value>
</property>
</bean>
我的 application.properties 文件内容:
username=someuser
password=ENC(encryptedstring)
为清楚起见更新: 通过 setEnv.sh 或 Eclipse 将环境变量添加到 weblogic 就可以了。只有当我使用 weblogic 控制台为集群添加环境变量时,jasypt 无法解析该值,因为它位于 JAVA_OPTIONS 内。
【问题讨论】:
-
这是一个老问题,答案是:stackoverflow.com/questions/15340892/… 该答案中有博客:chrislovecnm.com/2011/06/16/…
-
我在发布之前找到了这个答案,它并没有解决我的问题。我的问题是关于 weblogic 中的环境变量以及 jasypt 库如何解析这些值。
-
您是否通过启动脚本启动托管服务器?这就是为什么您需要在 JAVA_OPTIONS 变量中添加这些参数的原因?如果是这样,那么您可以使用您的 jasypt 值创建自己的启动脚本,并调用 WLS 脚本。如果您使用的是节点管理器,那么您可以通过管理控制台添加这些值
-
不幸的是,我不确定我们的 weblogic 集群是如何设置的。我只是一个开发者,不是管理员。管理员告诉我通过控制台在参数文本框中的 Home >Summary of Deployments >Summary of Environment >Summary of Servers >Server01 位置下将环境变量添加到我们的开发环境中。这会将 env var 添加到 JAVA_OPTIONS 变量中,而不是作为它自己的变量。