gpt4 book ai didi

glassfish - 如何在 JNDI 查找中存储凭据?

转载 作者:行者123 更新时间:2023-12-04 05:28:08 24 4
gpt4 key购买 nike

我有一个包含多个 properties 的应用程序文件,我很好奇是否更容易存储这些 username/password/server-url-to-login-to JNDI 查找中的组合,而不是 .jar 中的此明文文件。

有几个问题:

  • 您可以使用 JNDI 存储不是数据库的凭据吗?
  • 您如何配置新的 JNDI 资源来存储这些属性?
  • 您将如何从资源中检索这些属性?

  • 我阅读的大部分文档都是如何为数据库连接设置 JNDI,对于我的使用,我没有连接到 任何 数据库,而是使用不同身份验证方案(请求消息中的 SOAP 用户/密码、HTTP Basic、 header 、SSL 等)的不同类型的 Web 服务。

    最佳答案

    您的问题的答案:

    1. Can you store credentials that aren't databases using JNDI?


    是的。

    1. How do you configure a new JNDI resource to store these properties?


    如果您使用的是 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;
    }
    }

    制作一个该类的 jar,将其添加到 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. How would you retrieve these properties from the resource?

    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"/>

    好吧,我希望就是这样。希望这会有所帮助。

    关于glassfish - 如何在 JNDI 查找中存储凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940763/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com