在 Atomikos 初始化期间,用户名和密码以纯文本形式记录

User names and passwords are logged in plain text during initialization of Atomikos

我们的项目依赖于 Atomikos 来提供轻量级的事务管理。然而,我们发现它在初始化时以明文形式记录了数据库用户名和密码。

例如

2015-10-15 16:43:01,106 [http-bio-8080-exec-4] INFO  com.atomikos.jdbc.AtomikosDataSourceBean  - AtomikosDataSoureBean 'LAB_Oracle': initializing with [ xaDataSourceClassName=oracle.jdbc.xa.client.OracleXADataSource, uniqueResourceName=LAB_Oracle, maxPoolSize=8, minPoolSize=1, borrowConnectionTimeout=30, maxIdleTime=60, reapTimeout=0, maintenanceInterval=60, testQuery=null, xaProperties=[URL=jdbc:oracle:thin:@***:1537:oocait01,user=***,password=**] loginTimeout=0]

是否有任何配置可以禁止记录这些机密信息?

就配置而言,您可以将日志类别 com.atomikos.jdbc.AtomikosDataSourceBean 的阈值设置为 WARN。有一些流行的日志记录框架的例子 here。这将过滤掉整条消息。

如果您只想过滤机密属性,您可以创建 AtomikosDataSourceBean 的子类并覆盖受保护的方法 printXaProperties()。然后您可以过滤掉任何机密属性,例如密码。

package my.com.atomikos.jdbc;

import java.util.Enumeration;
import java.util.Properties;

public class AtomikosDataSourceBean extends com.atomikos.jdbc.AtomikosDataSourceBean {
    private static final long serialVersionUID = 1L;

    protected String printXaProperties()
    {
        Properties xaProperties = getXaProperties();
        StringBuffer ret = new StringBuffer();
        if ( xaProperties != null ) {
            Enumeration it = xaProperties.propertyNames();
            ret.append ( "[" );
            boolean first = true;
            while ( it.hasMoreElements() ) {
                String name = ( String ) it.nextElement();
                if ( name.equals ( "password" ) ) continue;
                if ( ! first ) ret.append ( "," );
                String value = xaProperties.getProperty( name );
                ret.append ( name ); ret.append ( "=" ); ret.append ( value );
                first = false;
            }
            ret.append ( "]" );
        }
        return ret.toString();
    }
}

由于 Atomikos 会自动检测日志记录框架,这可能会根据您测试、打包和部署应用程序的方式而有所不同,因此使用子类可能更安全。

我提交了一个 pull request 可以进入第 4 版。我们拭目以待。