我正在使用嵌入式Glassfish(org.glassfish.main.extras:glassfish-embedded-all:3.1.2.2)并尝试添加JDBC领域.应用程序部署正常但在尝试登录时(基本身份验证显示正确的域名称)会出现以下错误消息:
com.sun.web.security.RealmAdapter authenticate警告: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);
Run Code Online (Sandbox Code Playgroud)
已部署应用程序的web.xml
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>myRealm</realm-name>
</login-config>
Run Code Online (Sandbox Code Playgroud)
我想如果没有指定默认的LoginModule(在domain/conf/login.conf中指定非嵌入式Glassfish的情况下)适用?
我的经验是,你无法通过这种方式创建一个嵌入 glassfish 的安全领域。原因是您需要启用安全管理。当然,您可以在嵌入式 glassfish 中启用安全管理,但这需要重新启动。这就是重点,通常您无法重新启动嵌入式 glassfish,因为您将失去状态,因此您也将失去配置的安全领域。
奇怪的是,我期望只是登录失败,而不是丢失的登录模块异常 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");
Run Code Online (Sandbox Code Playgroud)
现在您可以在测试资源中指定整个测试域。为此,您需要从工作的独立 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
Run Code Online (Sandbox Code Playgroud)
如果您使用的是,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());
Run Code Online (Sandbox Code Playgroud)
请注意更改服务器的端口,这样如果另一个 glassfish 实例正在运行,您就不会收到错误消息。此外,您还应该删除domain.xml 以加快测试速度。
现在您可以在domain.xml中的标签<security-service>插入下指定您的安全领域,如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
就这些,很容易做吧?;D
注意:如果需要,您可以在 login.conf 中指定 LoginModules。
注意2:我认为 myRealm (不带引号)是该命令中的拼写错误?->'glassfish.getCommandRunner().run("create-auth-realm","--classname","com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm","--property",realmProperties ,我的领域);'
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |