2

セキュリティ マネージャを使用して Tomcat にデプロイされた Web アプリケーションでは、次のように動作します。

URL url = servletContext.getResource("/WEB-INF/internal/tika/tika-app-1.2.jar");
// test to see if the content can be read
String test = IOUtils.toString(url);

Tomcat は内部 URL に jndi を使用します。セキュリティ マネージャーに関する tomcat のドキュメント (リンクはこちら) によると、war ファイル内のリソースに付与される暗黙のアクセス許可があります。

ただし、これは機能しません。

URL url = servletContext.getResource("/WEB-INF/internal/tika/tika-app-1.2.jar");
ClassLoader cl = new URLClassLoader(new URL[] { url }, this.getClass().getClassLoader());
// load a class from the jar
Class<TextExtractor> clz = (Class) cl.loadClass(" ... some class ...");
delegate = clz.newInstance();

私が得る例外はこれです:

Caused by: java.security.AccessControlException: access denied (org.apache.naming.JndiPermission jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.net.URLClassLoader$4.run(URLClassLoader.java:515)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.getPermissions(URLClassLoader.java:513)
at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:235)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at com.sample.myClass.afterPropertiesSet(TikaWrapper.java:38)

私の最初の質問は次のとおりだと思います:なぜですか?

これを catalina.policy ファイルに追加すると、機能します。

permission org.apache.naming.JndiPermission "jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar";

ただし、クライアントはポリシー ファイルを変更したくないか、変更できません。

私の 2 番目の質問は次のとおりです。jar を /WEB-INF/lib の下に置くことはできません。それ以外の場合は、既に行っています。私はそれをTomcatの外にまとめてfile://ベースのURLでロードすることができますが、私はそれを避けようとしています.

4

1 に答える 1

1

最初の質問については、セキュリティ マネージャーの下で実行するときのクラスの読み込みに関する小さなメモがドキュメントにあり、便宜上ここに引用しています。

セキュリティ マネージャの下で実行している場合、クラスのロードが許可される場所は、ポリシー ファイルの内容にも依存します。

そのため、デフォルトでは、webapp クラスローダーは WEB-INF/lib および WEB-INF/classes ディレクトリからのクラスをロードできるようになっているようです。あなたの場合、カスタムクラスローダーの親としてwebappクラスローダーを割り当てているように見えるため、後者はその親と同じで、WEB-INF/libおよびWEB-INF/classesからのみクラスをロードできます.

何をすべきかについては、クライアントがポリシー ファイルを変更したくない、または変更できないため、ポリシーをプログラムで変更することを検討してください。ここに良い例があります。ただし、現在のアクセス許可のセットで () メソッドの呼び出しが許可されている場合にのみ機能しますjava.security.Permission.setPolicy。これは、JVM システム全体のポリシーを設定するため、機能しないに違いありません。

于 2013-01-17T22:07:13.767 に答える