Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SecurityManager下的SpringBoot webapp在授予AllPermission时抛出异常_Java_Spring_Tomcat_Spring Boot - Fatal编程技术网

Java SecurityManager下的SpringBoot webapp在授予AllPermission时抛出异常

Java SecurityManager下的SpringBoot webapp在授予AllPermission时抛出异常,java,spring,tomcat,spring-boot,Java,Spring,Tomcat,Spring Boot,我们将SpringBoot(1.1.6)应用程序作为.war文件部署到Tomcat7.0.52/OpenJDK7服务器。我们需要在SecurityManager下运行此服务器 即使我们使用允许对所有代码拥有AllPermission的策略操作服务器(本质上与不在SecurityManager下运行相同),我们也会因反射活动而引发异常。下面是其中一个异常的完整堆栈跟踪 java.lang.IllegalAccessException: Class org.apache.catalina.secur

我们将SpringBoot(1.1.6)应用程序作为.war文件部署到Tomcat7.0.52/OpenJDK7服务器。我们需要在SecurityManager下运行此服务器

即使我们使用允许对所有代码拥有AllPermission的策略操作服务器(本质上与不在SecurityManager下运行相同),我们也会因反射活动而引发异常。下面是其中一个异常的完整堆栈跟踪

java.lang.IllegalAccessException: Class org.apache.catalina.security.SecurityUtil$1 can not access a member of class org.springframework.boot.context.web.ErrorPageFilter with modifiers "public"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:109) ~[na:1.7.0_65]
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261) ~[na:1.7.0_65]
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253) ~[na:1.7.0_65]
    at java.lang.reflect.Method.invoke(Method.java:599) ~[na:1.7.0_65]
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:277) ~[catalina.jar:7.0.52]
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274) ~[catalina.jar:7.0.52]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_65]
    at javax.security.auth.Subject.doAsPrivileged(Subject.java:536) ~[na:1.7.0_65]
    at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309) ~[catalina.jar:7.0.52]
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:249) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:191) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:187) ~[catalina.jar:7.0.52]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_65]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:186) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) ~[catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [catalina.jar:7.0.52]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:7.0.52]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) [catalina.jar:7.0.52]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.52]
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683) [catalina.jar:7.0.52]
    at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:178) [logback-access-1.0.13.jar:na]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.52]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [catalina.jar:7.0.52]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) [tomcat-coyote.jar:7.0.52]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) [tomcat-coyote.jar:7.0.52]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) [tomcat-coyote.jar:7.0.52]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_65]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_65]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_65]
应用于服务器的策略文件如下所示:

grant { 
  permission java.security.AllPermission;
  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
。。我们添加了显式的
ReflectPermission
,以防
AllPermission
没有包含它,但我们尝试了两种方法


任何关于为什么只有在使用上述策略的SecurityManager下运行时才会引发异常的指针?

该错误不是由Java安全性引起的,而是由Java语言访问规则引起的

ErrorPageFilter类包可见[1]。Tomcat试图通过反射调用该类的public方法,但不能,因为根据Java语言规则,该类本身是不可访问的

[1]

(我正在链接到master branch,但您实际使用的是1.1.6版,因此上述链接的内容可能会随着时间的推移而改变)

非公共过滤器是不常见的。在以前,当所有过滤器都在web.xml中声明时,不可能使用这种非公共过滤器。我不知道SpringBoot的内部结构,但我想这个过滤器是通过编程方式添加到web应用程序中的,使用的是Servlet3.0API

可能的方法:

a) 要求Spring引导开发人员公开该类

b) 更改ApacheTomcat,这样它就不会查找由特定类声明的方法,而是查找由特定接口声明的方法。可以在实现该接口的类上调用接口声明的java.lang.reflect.Method。我希望此解决方案能够通过sun.reflect.Reflection.ensureMemberAccess()中的检查,但需要实际测试

这需要更改内部TomcatAPI以将接口类(在本例中为javax.servlet.Filter)作为附加参数传递给这些方法

从技术上讲,这需要:

  • 将问题提交到Tomcat Bugzilla-DONE中
  • 提供一个简单的复制配方,以便进行测试
  • 等待下一个版本
更新:我将此文件归档到Bugzilla,

是的。。理解并感谢您的回复。但问题是,为什么只有当JVM有一个活动的安全管理器(不管策略如何)时才会出现这种行为?当没有SecurityManager时,该类似乎是可访问的,当有SecurityManager时,该类似乎是不可访问的。第237-238行对第241行。可以调用过滤器接口的方法。无法获取特定类的方法。无法获取它。。非常感谢。我在SpringBoot github页面上另外询问了该类的可见性,几个月前讨论了一个类似的问题:SpringBoot问题也提出了: