2016-05-26 10 views
0

Ich verwende hsql als Datenbank-Backend und ich möchte JDBCRealm für Authentifizierung/Autorisierung konfigurieren. Ich benutze IntelliJ für die Entwicklung und Bereitstellung und Tomcat 7.Tomcat JDCBRealm findet keine Treiberklasse

Dies ist mein 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> 

und ich habe hsqldb als Bibliothek hinzugefügt:

enter image description here

Als ich Wenn Sie die Anwendung bereitstellen, findet JDBCRealm den hinzugefügten Treiber nicht:

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) 

Aber um sicherzustellen, dass die aformentioned Klasse richtig geladen werden kann, habe ich diesen Schnipsel:

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(); 
     } 
    } 

Wie es erwartet wird, durch die richtige URL im Servlet resultierenden anfordernden ausgeführt werden, wobei die Server drucken This is working anzeigt, dass die Klasse, die JDBCRealm nicht gefunden hat, ist richtig geladen.

Irgendeine Idee, was das Problem ist? Ich habe nur zwei Hinweise, die vielleicht relevant (oder möglicherweise irrelevant!):

  1. einige meiner zusätzlichen Bibliotheken hsql einschließlich nicht hinzugefügt target/WEB-INF/lib:

enter image description here

Aber die Frage ist, : Wenn es nicht als Bibliothek im Ziel hinzugefügt wurde, also wie das vorherige Snippet funktionierte?

Umgehung

Obwohl ich keine Ahnung, warum JDBCRealm nicht die HSQLDriver findet, sondern durch seine JAR-Datei /var/lib/tomcat7/lib Kopieren wo einer der Orte ist, die Lasten JARS catalina, wurde das Problem gelöst. Aber es ist immer noch ein Rätsel für mich, wie ich das Problem auf eine normale Art und Weise beheben kann.

Antwort

1

Die Lösung, die Sie gewählt haben, ist die Standardmethode: Der Realm läuft außerhalb Ihrer Anwendung, daher kann er nicht von dem Code abhängen, der mit Ihrer Anwendung eingeführt wird - muss den globalen Klassenpfad auswählen.

Wenn es auf Code von Ihrer Webapp beruhen würde, würde dies tatsächlich einen interessanten Angriffsvektor einführen, wo Ihre App für ihre eigene Authentifizierung verantwortlich ist: Nicht die Absicht der Autoren, also ist dies die Situation, die Sie müssen sorgen für.

1

Ihre Problemumgehung ist keine Problemumgehung. Es ist der Standard Weg.

Lesen Sie die Dokumentation von JDBCRealm:

Quick Start

Tomcat einzurichten JDBCRealm zu verwenden, müssen Sie die folgenden Schritte ausführen:

  1. Wenn Sie nicht haben Dennoch erstellen Sie Tabellen und Spalten in Ihrer Datenbank, die den oben beschriebenen Anforderungen entsprechen.
  2. Konfigurieren Sie einen Datenbankbenutzernamen und ein Kennwort für die Verwendung durch Tomcat, das mindestens über Lesezugriff auf die oben beschriebenen Tabellen verfügt. (Tomcat wird niemals versuchen, in diese Tabellen zu schreiben.)
  3. Legen Sie eine Kopie des JDBC-Treibers, den Sie verwenden möchten, in das Verzeichnis $CATALINA_HOME/lib. Beachten Sie, dass nur JAR-Dateien erkannt werden!
  4. Richten Sie ein <Realm> Element, wie unten beschrieben, in IhrerDatei ein.
  5. Starten Sie Tomcat neu, wenn es bereits ausgeführt wird.

Das liegt daran, dass das Reich außerhalb der Webapp verwaltet wird, auch wenn es nur auf einen einzigen Kontext gilt.

Verwandte Themen