- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们将 Spring Boot (1.1.6) 应用程序作为 .war 文件部署到 Tomcat 7.0.52/OpenJDK 7 服务器。我们需要在 SecurityManager 下运行这个服务器。
即使我们使用允许所有代码的 AllPermission 的策略操作服务器(本质上与不在 SecurityManager 下运行相同),我们也会因反射 Activity 而抛出异常。这是其中一个异常的完整堆栈跟踪。
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 语言规则,该类本身不可访问。
(我链接的是master分支,但是你实际使用的是1.1.6版本,所以上面链接的内容可能会随着时间变化)
非公共(public)过滤器是不寻常的。在过去,当所有过滤器都在 web.xml 中声明时,不可能使用此类非公共(public)过滤器。我不知道 Spring Boot 的内部结构,但我猜这个过滤器是使用 Servlet 3.0 API 以编程方式添加到 Web 应用程序中的。
可能的处理方式:
a) 要求 Spring Boot 开发人员公开该类
b) 更改 Apache Tomcat,以便不再查找特定类声明的方法,而是查找特定接口(interface)声明的方法。接口(interface)声明的 java.lang.reflect.Method 可以在实现该接口(interface)的类上调用。我希望此解决方案能够通过 sun.reflect.Reflection.ensureMemberAccess() 中的那些检查,但需要进行实际测试。
这需要更改内部 Tomcat API 以将接口(interface)类(在本例中为 javax.servlet.Filter)作为附加参数传递给这些方法。
从技术上讲,这需要:
更新:我将其归档到 Bugzilla 中, https://issues.apache.org/bugzilla/show_bug.cgi?id=57281
关于java - Java SecurityManager下的SpringBoot webapp在授予AllPermission时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189047/
我想指定某些小程序在我的计算机上使用 java.security.AllPermission 运行(用于调试和安全测试)。但是,我不想让我运行的所有小程序都具有此权限。因此,编辑我的用户 Java 策
我正在尝试将 WAR 部署到 Tomcat,但遇到了 Java 安全管理器的问题。这是运行 Java 1.8.0 的 Tomcat 7.0.55,并且 Tomcat 以这样的参数启动: -Dcatal
经过大量阅读和测试后,我无法通过 codeBase 授予选项将所有权限授予 Intranet applet。此小程序需要完全权限,因为它必须访问 OCR 阅读器(也将图像文件写入硬盘)和其他此类外部设
我试图让自己熟悉 SecurityManager 但即使是这个简单的场景也会失败。当我从我的 IDE 内部或命令行运行以下命令时,我得到以下 exception ; access denied ("j
在我的 XPages 应用程序中,我通过序列化某些对象并将其保存到备份文档中的 MIME 实体来备份它们。为了稍后重新加载对象,我使用以下服务器端 JavaScript 函数进行反序列化: var e
我是一名优秀的程序员,十分优秀!