簡體   English   中英

使用安全管理器和內部URLClassLoader的Tomcat上的JndiPermission錯誤

[英]JndiPermission error on tomcat with security manager and internal URLClassLoader

在使用安全管理器在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使用jndi作為內部URL。 根據有關安全管理器的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";

但是,客戶端不願意或無法更改其策略文件。

我的第二個問題是:知道該怎么做嗎? 我無法將jar放在/ WEB-INF / lib下,否則我已經做完了。 我可以將其放置在tomcat之外,並使用基於file://的URL加載它,但是我試圖避免使用它。

關於第一個問題,在文檔中的安全性管理器下運行時,有關於類加載的小注釋 ,為方便起見在此引用:

在安全管理器下運行時,允許加載類的位置也將取決於策略文件的內容。

因此,它似乎在默認情況下web應用程序的類加載器被允許從WEB-INF / lib和WEB-INF /類目錄中加載類。 在您的情況下,您似乎將webapp類加載器作為父級分配給自定義類加載器,因此后者與其父級相同,只能從WEB-INF / lib和WEB-INF / classs中加載類。

至於該怎么做,由於客戶端不希望或不能更改策略文件,請考慮嘗試以編程方式更改策略。 有一個很好的例子在這里 但是,只有在當前的權限集允許調用java.security.Permission.setPolicy ()方法時,它才起作用,我敢打賭,因為這會設置JVM系統范圍的策略,所以它不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM