尽管使用了 AllPermission,但 Tomcat AccessControlException
Posted
技术标签:
【中文标题】尽管使用了 AllPermission,但 Tomcat AccessControlException【英文标题】:Tomcat AccessControlException despite using AllPermission 【发布时间】:2016-08-25 13:47:46 【问题描述】:我正在尝试将 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
s 仍然会被抛出并阻止部署。
这里发生了什么?我该如何解决这个问题?
【问题讨论】:
你解决过这个问题吗? 唉,不。 “解决方案”是禁用安全管理器。 感谢您的回复!您的代码是否/是否碰巧使用了 ForkJoinPool?这就是给我造成问题的原因。 “如果存在 SecurityManager 且未指定工厂,则默认池使用工厂提供未启用权限的线程” 【参考方案1】:我们的不是在部署期间出现,而是在重负载测试时出现。
我们将 server.xml 中的连接器从 Nio2 更改为 Nio,它为我们解决了问题 org.apache.coyote.http11.Http11NioProtocol(NIO的第一个版本,而不是NIO2)。
我们没有禁用 tomcat 安全管理器,这违反了我们公司的政策。
【讨论】:
以上是关于尽管使用了 AllPermission,但 Tomcat AccessControlException的主要内容,如果未能解决你的问题,请参考以下文章
宽带网络虚拟化:与Tom Cloonan和David Grubb面对面
尽管使用了工作区,但 Azure Pipeline '没有这样的模块'
我用的是tom邮箱,在cy左侧登陆,但为啥总是说让我登录邮箱?我快要疯了啊!
尽管使用了 if 语句,但 RelatedObjectDoesNotExist 错误
尽管使用了 itemsBoundingRect(),但 QGraphicsScene 和 fitInView() 无法正确缩放