我使用hsql作为我的数据库后端,我想配置JDBCRealm进行身份验证/授权。我使用Intellij进行开发和部署以及Tomcat 7。
这是我的context.xml
:
<Context antiJARLocking="true">
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.hsqldb.jdbcDriver"
connectionURL="jdbc:hsqldb:hsql://localhost"
userTable="customers" userNameCol="username" userCredCol="password"
userRoleTable="roles" roleNameCol="role_name"/>
</Context>
我已将hsqldb添加为库:
部署应用程序时,JDBCRealm找不到添加的驱动程序:
Caused by: java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:195)
at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:688)
但是为了确保正确加载前面提到的类,我添加了这个片段:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class foo = Class.forName("org.hsqldb.jdbcDriver");
System.out.println("This is working!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
正如预期的那样,通过请求正确的URL导致servlet被执行,服务器打印This is working
,表明正确加载了JDBCRealm
未找到的类。
知道问题是什么吗? 我只有两条可能相关的线索(或可能不相关!):
答案 0 :(得分:1)
您选择的解决方案是标准方式:Realm在您的应用程序之外运行,因此它不依赖于您的应用程序引入的代码 - 它必须选择全局类路径。
如果它依赖于你的webapp中的代码,这实际上会引入一个有趣的攻击向量,你的应用程序负责自己的身份验证:不是作者的意图,因此这是你必须满足的情况对
答案 1 :(得分:1)
您的解决方法不是解决方法。 是标准方式。
请参阅JDBCRealm
的文档:
快速入门
要设置Tomcat以使用JDBCRealm,您需要按照以下步骤操作:
- 如果您还没有这样做,请在数据库中创建符合上述要求的表和列。
- 配置供Tomcat使用的数据库用户名和密码,该用户名和密码至少具有对上述表的只读权限。 (Tomcat永远不会尝试写入这些表。)
- 在
$CATALINA_HOME/lib
目录中放置您将使用的JDBC驱动程序的副本。请注意,只能识别JAR文件!- 在
<Realm>
文件中设置$CATALINA_BASE/conf/server.xml
元素,如下所述。- 如果Tomcat已在运行,请重新启动它。
醇>
这是因为Realm是在webapp之外管理的,即使它只适用于单个Context。