【问题标题】:Howto use JDBC realm in embedded Glassfish如何在嵌入式 Glassfish 中使用 JDBC 领域
【发布时间】:2013-03-04 22:35:46
【问题描述】:

我正在使用嵌入式 Glassfish (org.glassfish.main.extras:glassfish-embedded-all:3.1.2.2) 并尝试添加 JDBC 领域。应用程序部署良好,但在尝试登录时(基本身份验证显示正确的域名)出现以下错误消息

com.sun.web.security.RealmAdapter 验证 警告:WEB9102:Web 登录失败:com.sun.enterprise.security.auth.login.common.LoginException:登录失败:没有为 jdbcRealm 配置 LoginModules

我的代码如下所示:

嵌入式 Glassfish

// create-jdbc-connection-pool ...    
// create-jdbc-resource ...

String realmProperties = "jaas-context=jdbcRealm:datasource-jndi=jdbc/myDB:user-table=Users:user-name-column=userid:password-column=password:group-table=Groups:group-name-column=groupid;

glassfish.getCommandRunner().run("create-auth-realm", "--classname", "com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property", realmProperties, myRealm);

已部署应用程序的 web.xml

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>myRealm</realm-name>
</login-config>

我想如果没有指定默认 LoginModule(在 domain/conf/login.conf 中指定非嵌入式 Glassfish 的情况下)是否适用?

【问题讨论】:

    标签: glassfish


    【解决方案1】:

    我的经验是,您无法以这种方式创建带有嵌入式 glassfish 的安全领域。原因是您需要启用安全管理员。当然,您可以在嵌入式 glassfish 中启用安全管理,但这需要重新启动。这就是重点,通常你不能重新启动嵌入式 glassfish,因为你会失去状态,所以你也会失去配置的安全领域。

    奇怪的是,我预计只是登录失败,而不是缺少 loginmodules-exception Oo。

    好消息,您可以尝试另一种可能会有所帮助的方法。 如果您使用EJBContainer.createEJBContainer(props); 创建一个 EJBContainer,您可以传递一些属性,并且我们可以使用一个属性。如下所示:

    Map<String, Object> props = new HashMap<String, Object>();
    props.put("org.glassfish.ejb.embedded.glassfish.instance.root", "./src/test/resources/testing-domain");
    

    现在您可以在测试资源中指定整个测试域。为此,您需要从工作的独立 Glassfish 3.1.2.2 中复制一些内容。我发现您需要以下资源才能使其发挥作用:

    testing-domain
        config
            admin-keyfile
            cacerts.jks
            domain.xml (there u can define the security-realm)
            keyfile
            keystore.jks
            logging.properties
            login.conf
            server.policy
            wss-server-config-1.0.xml
            wss-server-config-2.0.xml
    

    如果您使用的是GlassFishRuntime.bootstrap().newGlassFish(glassfishProperties);,您只需要 domain.xml 和这个 sn-p:

    GlassFishProperties glassfishProperties = new GlassFishProperties();
    File configFile = new File("src/test/resources/META-INF", "domain.xml");
    glassfishProperties.setConfigFileURI(configFile.toURI().toString());
    

    请注意更改服务器的端口,这样如果另一个 glassfish 实例正在运行,您就不会收到错误消息。此外,您应该剥离 domain.xml 以加快测试速度。

    现在您可以在 domain.xml 中的标签 &lt;security-service&gt; 下指定您的安全领域,插入如下内容:

    <auth-realm name="JDBC-AccountRealm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
        <property name="jaas-context" value="jdbcRealm"></property>
        <property name="password-column" value="PASSWORD"></property>
        <property name="datasource-jndi" value="jdbc/__default"></property>
        <property name="group-table" value="ACCOUNT_GROUP"></property>
        <property name="user-table" value="ACCOUNT"></property>
        <property name="group-name-column" value="GROUPS"></property>
        <property name="group-table-user-name-column" value="EMAIL"></property>
        <property name="user-name-column" value="EMAIL"></property>
        <property name="digest-algorithm" value="SHA-256"></property>
        <property name="encoding" value="Hex"></property>
    </auth-realm>
    

    就这么简单,对吧? ;D

    注意:如果需要,可以在 login.conf 中指定 LoginModules。

    注意2:我假设 myRealm(不带引号)是该命令中的错字? -> 'glassfish.getCommandRunner().run("create-auth-realm", "--classname", "com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property", realmProperties , myRealm);'

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2016-07-29
      • 1970-01-01
      • 2017-04-02
      • 2012-07-26
      • 2013-06-08
      相关资源
      最近更新 更多