Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在嵌入式Glassfish中使用JDBC领域_Glassfish - Fatal编程技术网

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

如何在嵌入式Glassfish中使用JDBC领域,glassfish,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.Login异常:登录失败:没有为

我正在使用嵌入式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.Login异常:登录失败:没有为jdbcRealm配置LoginModule

我的代码如下所示:

<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>
嵌入式玻璃鱼

// 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(在域/conf/login.conf中指定了非嵌入式Glassfish的情况下)将适用?

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

奇怪的是,我只希望登录失败,而不是缺少LoginModule异常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");
如果您使用的是
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实例正在运行时不会出现错误。此外,您还应该去掉domain.xml以加快测试速度

现在,您可以在domain.xml中的标签
下指定您的安全领域,插入如下内容:

<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(不带引号)是该命令中的一个输入错误?->'glassfish.getCommandRunner().run(“创建身份验证领域”、“--classname”、“com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm”、“--property”、realmProperties、myRealm);'