如何在嵌入式Glassfish中使用JDBC领域

时间:2013-03-04 22:35:46

标签: glassfish

我正在使用嵌入式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配置LoginModule

我的代码如下所示:

嵌入式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的情况下)适用?

1 个答案:

答案 0 :(得分:0)

我所做的经验是你不能用这种方式用嵌入式玻璃鱼创建一个安全领域。原因是您需要启用安全管理员。当然,您可以在嵌入式glassfish中启用secure-admin,但需要重新启动。这就是重点,通常你不能重新启动嵌入式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和此代码段:

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

请注意更改服务器的端口,这样如果另一个glassfish-instance正在运行,您将不会收到错误。此外,您应该删除domain.xml以加快测试速度。

现在,您可以在标记<security-service>下的domain.xml中指定您的security-realm,插入如下内容:

<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中指定LoginModule。

注2:我认为myRealm(没有引号)是该命令中的拼写错误? - &GT; 'glassfish.getCommandRunner()。run(“create-auth-realm”,“ - classname”,“com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm”,“ - property”,realmProperties,myRealm );'