你怎么能存储在一个JNDI查找凭证?(How can you store credentials i

2019-08-01 14:27发布

我有几个应用程序properties文件,我很好奇,如果它会更容易存储这些username / password / server-url-to-login-to连击的JNDI查找,而不是这个明确的文本文件,一个.jar 。

有几个问题:

  1. 你可以存储在不使用JNDI数据库凭据?
  2. 你如何配置一个新的JNDI资源来存储这些属性呢?
  3. 你会如何检索资源这些属性?

最让我阅读文档的是如何建立JNDI数据库连接,并为我所用,我没有连接到任何数据库,而是不同类型采用不同的认证方案的Web服务(在请求消息SOAP用户名/密码, HTTP基本,头,SSL等)。

Answer 1:

该问题的答案:

  1. 你可以存储在不使用JNDI数据库凭据?

是。

  1. 你如何配置一个新的JNDI资源来存储这些属性呢?

如果您使用的是GlassFish 2,你必须创建自定义PropertiesObjectFactory类来处理JNDI的特性java.util.Porperties

对于如PropertiesObjectFactory类看起来是这样的:

public class PropertiesObjectFactory implements Serializable, ObjectFactory {

    public static final String FILE_PROPERTY_NAME = "org.glassfish.resources.custom.factory.PropertiesFactory.fileName";

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
            throws Exception {
        Reference ref = (Reference) obj;
        Enumeration<RefAddr> refAddrs = ref.getAll();

        String fileName = null;
        Properties fileProperties = new Properties();
        Properties properties = new Properties();

        while (refAddrs.hasMoreElements()) {
            RefAddr addr = refAddrs.nextElement();
            String type = addr.getType();
            String value = (String) addr.getContent();

            if (type.equalsIgnoreCase(FILE_PROPERTY_NAME)) {
                fileName = value;
            } else {
                properties.put(type, value);
            }
        }

        if (fileName != null) {
            File file = new File(fileName);
            if (!file.isAbsolute()) {
                file = new File(System.getProperty("com.sun.aas.installRoot") + File.separator + fileName);
            }
            try {
                if (file.exists()) {
                    try {
                        FileInputStream fis = new FileInputStream(file);
                        if (fileName.toUpperCase().endsWith("XML")) {
                            fileProperties.loadFromXML(fis);
                        } else {
                            fileProperties.load(fis);
                        }
                    } catch (IOException ioe) {
                        throw new IOException("IO Exception during properties load : " + file.getAbsolutePath());
                    }
                } else {
                    throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
                }
            } catch (FileNotFoundException fnfe) {
                throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
            }
        }
        fileProperties.putAll(properties);
        return fileProperties;
    }
}

作出这样的类的罐子,把它添加到GlassFish的全局类路径。 这将是: /glassfish/domains/domain1/lib ,然后你可以指定它作为你的一个工厂类JNDI属性配置。

Glassfish的3已经有了性工厂类。 它被设置成: org.glassfish.resources.custom.factory.PropertiesFactory

打开GlassFish管理控制台,并导航到:资源- > JNDI - >自定义资源,单击“新建”,提供了一个JNDI名称,如: jndi/credentials ,选择资源型java.util.Properties ,指定工厂类: org.glassfish.resources.custom.factory.PropertiesFactory ,然后单击“添加属性”,用于如指定名称: testUsernameName和值列testUsernameValue 。 单击确定,那就是一切,你已经配置JNDI资源。 :只要你喜欢这个,你可以添加尽可能多的性能jndi/credentials的资源。

不要忘记,当您完成创建资源重新启动应用服务器。

  1. 你会如何检索资源这些属性?
public Properties getProperties(String jndiName) {
    Properties properties = null;
    try {
        InitialContext context = new InitialContext();
        properties = (Properties) context.lookup(jndiName);
        context.close();
    } catch (NamingException e) {
        LOGGER.error("Naming error occurred while initializing properties from JNDI.", e);
        return null;
    }
    return properties;
}

例如如何获得的财产:

String username = someInstance.getProperties("jndi/credentials").getProperty("testUsernameName"); 

你的username是: testUsernameValue

当调用应用程序中的这种方法提供了一个JNDI你在你的应用程序服务器配置的名称: jndi/credentials 。 如果您在部署描述符中映射的资源,你必须使用: java:comp/env/jndi/credentials

如果你想要做的使用相同的Spring

<jee:jndi-lookup id="credentials"
                 jndi-name="jndi/credentials"/>

那么我希望完蛋了。 希望这可以帮助。



文章来源: How can you store credentials in a JNDI lookup?