我试图将WAR部署到Tomcat并遇到Java安全管理器的问题。这是运行Java 1.8.0的Tomcat 7.0.55,并且使用以下参数启动Tomcat:
-Dcatalina.base="/path/to/apache-tomcat-7.0.55"
-Dcatalina.home="/path/to/apache-tomcat-7.0.55"
-Djava.endorsed.dirs="/path/to/apache-tomcat-7.0.55\endorsed"
-Djava.security.manager
-Djava.security.policy="/path/to/config/custom_catalina.policy"
重要的是,它启用了Java安全管理器,然后将其指向自定义安全策略,如下所示:
grant {
permission java.security.AllPermission;
};
这似乎会导致激活安全管理器的相当无意义的配置,然后告诉它只允许一切(我不会运行服务器,所以不要怪我!)。但是,当我部署我的WAR时,它失败了几个包含以下内容的堆栈跟踪:
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.version" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457) ~[?:1.8.0_51]
at java.security.AccessController.checkPermission(AccessController.java:884) ~[?:1.8.0_51]
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[?:1.8.0_51]
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[?:1.8.0_51]
at java.lang.System.getProperty(System.java:753) ~[?:1.8.0_51]
at org.apache.commons.lang3.JavaVersion.maxVersion(JavaVersion.java:196) ~[commons-lang3-3.4.jar:3.4]
我已尝试使用以下内容明确授予AllPermission
我自己的应用程序:
grant codeBase "file:${catalina.home}/webapps/myApp/-" {
permission java.security.AllPermission;
};
甚至明确授予PropertyPermission
阅读java.version
。没有任何区别。相同的AccessControlException
仍会被抛出并阻止部署。
这里发生了什么?我该如何解决这个问题?
答案 0 :(得分:0)
我们不是在部署过程中来的,而是在重负载测试时来的。
我们将server.xml中的Connector从Nio2更改为Nio,从而为我们解决了问题 org.apache.coyote.http11.Http11NioProtocol(NIO的第一个版本,而不是NIO2)。
我们没有禁用tomcat安全管理器,这违反了我们公司的政策。