Tag: java security manager

除了对System.exit进行单个检查调整之外,与NO安全管理器相同的java SecurityManager

我不熟悉java安全管理器,因此想确认我的理解: 我有一个java进程随机停止(关闭钩子运行),即使没有人杀死它的痕迹。 因此,我决定安装一个安全管理器并覆盖checkExit(int status)以确保stop的原因不是调用System.exit() 。 基本上我写了这个: System.setSecurityManager(new SecurityManager() { @Override public void checkExit(int status) { Thread.dumpStack(); super.checkExit(status); } }); 我期待我的程序将像往常一样运行,唯一的变化是如果调用System.exit()则会转储堆栈跟踪。 我发现事实并非如此。 它无法从此安全exception开始: java.security.AccessControlException: access denied (“java.util.PropertyPermission” “config” “read”) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[na:1.8.0_74] at java.security.AccessController.checkPermission(AccessController.java:884) ~[na:1.8.0_74] at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[na:1.8.0_74] at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[na:1.8.0_74] at java.lang.System.getProperty(System.java:717) ~[na:1.8.0_74] at Main.main(Main.java:161) ~[na:na] 似乎SecurityManager不会复制默认行为,在阅读之后,它似乎应用了${JAVA_HOME}/jre/lib/security/java.policy下的默认策略,这是非常严格的。 没有安全管理器时,Java的真正默认行为是什么? 它是“允许一切”还是还有其他事情发生? 除了上面的单一调整之外,如果我想复制默认行为,我应该作为安全管理器安装什么? 在最后一点,我可以看到System.setSecurityManager()实际上需要一个java.lang.SecurityManager实例,这意味着我被迫使用该实现(依赖于策略文件)。 在该类中重写方法以复制NO安全管理器的实际默认行为的最有效方法是什么? 编辑:根据下面的讨论,这似乎做到了 System.setSecurityManager(new SecurityManager() […]