这可能是非常基本的,但我现在坚持了几个小时,所以请听我说。
我正在尝试在Eclipse中的Glassfish 4.0上的Java 7 Web应用程序中进行基于JDBCRealm的身份验证。此博客post是用于配置JDBCRealm的参考。
web.xml如下
<login-config>
<auth-method>FORM</auth-method>
<realm-name>MyJDBCRealm</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/tologin.html</form-error-page>
</form-login-config>
</login-config>
当我启动Glassfish服务器时,它清楚地写在控制台中:
SEC1115: Realm [MyJDBCRealm] of classtype [com.sun.enterprise.security.ee.auth.realm.jdbc.JDBCRealm] successfully created.
但是当我请求任何应用程序的资源时,我得到了这个异常
javax.naming.NamingException: Lookup failed for 'MyJDBCRealm' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: MyJDBCRealm not found]
有根本原因:
javax.naming.NameNotFoundException: MyJDBCRealm not found
at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
...
发生在这里
public DataSource getDataSource() {
DataSource datasource = null;
try {
datasource = (DataSource) initialContext.lookup("MyJDBCRealm");
} catch (NamingException ex) {
ex.printStackTrace();
}
return datasource;
}
我应该注意到Hibernate成功连接到后端数据库并映射表格,在glassfish控制台中,我可以成功ping通JDBC连接池。
答案 0 :(得分:1)
我猜你有点困惑。
领域与数据源不同。要在Java中获取领域的实例,您可以执行以下操作:
JDBCRealm realm = (JDBCRealm) Realm.getInstance("realmName");
如果您真的想要获取数据源,则必须使用JNDI名称,该名称通常以jdbc/
开头,如下所示:
DataSource datasource = (DataSource) initialContext.lookup("jdbc/MyJDBCRealm");
但无论如何,我认为对于普通的基于JDBC的身份验证,您不需要这样的东西。