我正在使用自定义Java SecurityManager作为沙盒插件。它在独立运行时工作正常,但是当我运行单元测试时,我得到了一堆AccessControlException
个。 E.g。
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:611)
at java.lang.ClassLoader.checkCreateClassLoader(ClassLoader.java:274)
at java.lang.ClassLoader.<init>(ClassLoader.java:316)
at java.security.SecureClassLoader.<init>(SecureClassLoader.java:76)
这是自定义的SecurityManager:
Policy.setPolicy(new Policy() {
@Override
public PermissionCollection getPermissions(CodeSource cs) {
Permissions mainPermissions = new Permissions();
mainPermissions.add(new AllPermission());
return mainPermissions;
}
});
// set a security manager so permissions get applied,
System.setSecurityManager(new SecurityManager());
答案 0 :(得分:0)
嗯...
事实证明这个问题与JUnit无关。这只是我的测试运行方式的副作用。此外,还有一个以上的问题。我不完全理解这一点,但我确实有一个解决方案。
问题1
在Logback的Loader中,有一些代码可以检查RuntimePermission的“getClassLoader”。这会产生异常,但显然会让我感到困惑。在此异常之后代码将继续正常(我在安全管理器中有一个断点以及安全调试已打开并认为这是问题)。
问题2
https://bugs.openjdk.java.net/browse/JDK-8143638
与fork连接池和并行流之间存在某种交互,这对我造成了另一个安全问题。我在使用CompletableFuture而没有指定我自己的执行程序。添加我自己的执行程序解决了这个问题。老实说,即使在阅读了这个bug和链接到文档之后,我也不确定为什么。