2016-05-26 28 views
0

私はデータベースバックエンドとしてhsqlを使用しています。認証/認可のためにJDBCRealmを設定したいと思います。私はこれが私のcontext.xmlで開発と展開とTomcatのために7Tomcat JDCBRealmがドライバクラスを見つけられない

をIntelliJのを使用しています:

<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を追加しました:

enter image description here

Iアプリケーションをデプロイすると、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) 

しかしaformentionedクラスが適切にロードすることができることを確実にするために、私はこのスニペットを追加:

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を要求することによって、サーバプリントThis is workingことを示しますJDBCRealmが見つかりませんでしたが、正しく読み込まれました。

問題は何ですか? 私は可能性があります関連する2つだけの手がかり持っ

enter image description here

しかし、問題は次のとおりです:hsql含めて私の追加したライブラリの一部はtarget/WEB-INF/libに追加されていない

  1. (またはおそらく無関係を!) :ターゲットにライブラリとして追加されていない場合は、以前のスニペットがどのように機能していたのですか?

    回避策

    私はJDBCRealmHSQLDriverを見つけるのではなく、負荷の瓶をカタリナ場所の一つです/var/lib/tomcat7/libにそのJARファイルをコピーすることによって、問題は解決してしまった理由はわかりませんが。しかし、標準的な方法で問題を解決する方法は私にとってはまだ謎です。

答えて

1

レルムがアプリケーション外で実行されているため、アプリケーションで導入されたコードに依存できません。グローバルクラスパスを選択する必要があります。

webappのコードに依存する場合、実際にはあなたのアプリが独自の認証を担当するという興味深い攻撃方法が導入されます。著者の意図ではないため、これはあなたがする必要がある状況です〜を満たす。

1

回避策は回避策ではありません。それは標準的な方法です。

JDBCRealmのドキュメントを参照してください:

クイックスタート

JDBCレルムを使用するようにTomcatを設定するには、これらの手順を実行する必要があります:

  1. あなたがいない場合上記の要件を満たすデータベース内のテーブルとカラムを作成します。
  2. Tomcatが使用するデータベースのユーザー名とパスワードを構成します。少なくとも上記の表に対する読み取り専用アクセス権を持ちます。
  3. $CATALINA_HOME/libディレクトリ内で使用するJDBCドライバのコピーを置いてください。 JARファイルのみが認識されることに注意してください。
  4. $CATALINA_BASE/conf/server.xmlファイルに下記のように<Realm>要素を設定します。
  5. すでに実行中のTomcatを再起動します。レルムはそれだけで一つのコンテキストに適用された場合でも、Webアプリケーションの外で管理されているためである

関連する問題