2017-05-27 1 views
0

Nous avons récemment mis à jour tomcat à 8.5.6 à partir de 8.0.32, et nous rencontrons un AccessControlException lorsque vous essayez de charger /opt/apache-tomcat-8.5.6_1/webapps/example/WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties, et je débogue le code source entre tomcat 8.5.6 et 8.0.32 , il est différent dans org.apache.catalina.loader.WebappClassLoaderBase.findResourcetomcat8.0 et tomcat8.5.6 WebappClassLoaderBase

Tomcat8.0

public URL findResource(final String name) { 

    if (log.isDebugEnabled()) 
     log.debug(" findResource(" + name + ")"); 

    checkStateForResourceLoading(name); 

    URL url = null; 

    String path = nameToPath(name); 

    ResourceEntry entry = resourceEntries.get(path); 
    if (entry == null) { 
     if (securityManager != null) { 
      PrivilegedAction<ResourceEntry> dp = 
       new PrivilegedFindResourceByName(name, path); 
      entry = AccessController.doPrivileged(dp); 
     } else { 
      entry = findResourceInternal(name, path); 
     } 
    } 
    if (entry != null) { 
     url = entry.source; 
     entry.webResource = null; 
    } 

    if ((url == null) && hasExternalRepositories) { 
     url = super.findResource(name); 
    } 

    if (log.isDebugEnabled()) { 
     if (url != null) 
      log.debug(" --> Returning '" + url.toString() + "'"); 
     else 
      log.debug(" --> Resource not found, returning null"); 
    } 
    return url; 
} 

Tomcat8.5.6

public URL findResource(final String name) { 

    if (log.isDebugEnabled()) 
     log.debug(" findResource(" + name + ")"); 

    checkStateForResourceLoading(name); 

    URL url = null; 

    String path = nameToPath(name); 

    WebResource resource = resources.getClassLoaderResource(path); 
    if (resource.exists()) { 
     url = resource.getURL(); 
     trackLastModified(path, resource); 
    } 

    if ((url == null) && hasExternalRepositories) { 
     url = super.findResource(name); 
    } 

    if (log.isDebugEnabled()) { 
     if (url != null) 
      log.debug(" --> Returning '" + url.toString() + "'"); 
     else 
      log.debug(" --> Resource not found, returning null"); 
    } 
    return url; 
} 

Comme vous pouvez le voir, tomcat8.0 ressources de charge par AccessController.doPrivileged, mais tomcat8.5.6, il charge la ressource directement, je pense que ce pourquoi je suis une exception

java.security.AccessControlException: access denied 
("java.io.FilePermission" 
"/opt/apache-tomcat-8.5.6_1/webapps/example/WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties" 
"read") 

java.lang.IllegalStateException: MASM0003: Default [ jaxws-tubes-default.xml ] configuration file was not loaded 
     at com.sun.xml.internal.ws.assembler.MetroConfigLoader.init(MetroConfigLoader.java:133) 
     at com.sun.xml.internal.ws.assembler.MetroConfigLoader.<init>(MetroConfigLoader.java:104) 

ce fichier est chargé par MetroConfigLoader,

private static JAXBContext createJAXBContext() throws Exception { 
     return isJDKInternal()?(JAXBContext)AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() { 
      public JAXBContext run() throws Exception { 
       return JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
      } 
     }, createSecurityContext()):JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
    } 

    private static AccessControlContext createSecurityContext() { 
     PermissionCollection perms = new Permissions(); 
     perms.add(new RuntimePermission("accessClassInPackage.com.sun.xml.internal.ws.runtime.config")); 
     perms.add(new ReflectPermission("suppressAccessChecks")); 
     return new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain((CodeSource)null, perms)}); 
    } 

Est-ce que quelqu'un se rencontrent même problème? ou il y a d'autres problèmes. Merci.

Répondre

1

Après trois jours des recherches, maintenant j'utilise jaxws-rt au lieu de la mise en œuvre par défaut dans le JDK, et que vous pouvez lire à partir du code JDK:

private static JAXBContext createJAXBContext() throws Exception { 
     return isJDKInternal()?(JAXBContext)AccessController.doPrivileged(new PrivilegedExceptionAction<JAXBContext>() { 
      public JAXBContext run() throws Exception { 
       return JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
      } 
     }, createSecurityContext()):JAXBContext.newInstance(MetroConfig.class.getPackage().getName()); 
} 

Si elle est interne, il va créer l'instance JDK avec spécifique privilège et tomcat obtenir des ressources par doPrivileged dans tomcat8.0, mais il est différent tomcat8.5, donc il ne peut pas obtenir la ressource sans privilège

java.security.AccessControlException: access denied ("java.io.FilePermission" 
"/opt/apache-tomcat-8.5.6_1/webapps/example/WEB-INF/classes/com/sun/xml/internal/ws/runtime/config/jaxb.properties" 
"read") 

donc j'ai changé pour jaxws-rt externe, et il crée la exemple directement. Je viens d'ajouter jaxws-rt à pom.

<dependency> 
     <groupId>com.sun.xml.ws</groupId> 
     <artifactId>jaxws-rt</artifactId> 
     <version>2.2.10</version> 
</dependency>