Java安全管理器-它检查什么?

Java安全管理器-它检查什么?,java,securitymanager,Java,Securitymanager,关于Java安全性的这篇文章说: Java库中的代码参考 每当发生危险事件时,安全经理 即将尝试此操作 那么,这到底意味着什么?比方说,如果我实现了自己的securitymanager并为整个JVM启用了它。现在,java运行时是为每个java调用(如System.out.println()等)咨询我的securitymanager,还是只为Dangerapi调用(如System.exit()、文件操作等)咨询 编辑:让我澄清我的问题 我不是在质疑安全经理的可能性。我只是问,安全检查是针对危险a

关于Java安全性的这篇文章说:

Java库中的代码参考 每当发生危险事件时,安全经理 即将尝试此操作

那么,这到底意味着什么?比方说,如果我实现了自己的securitymanager并为整个JVM启用了它。现在,java运行时是为每个java调用(如System.out.println()等)咨询我的securitymanager,还是只为
Danger
api调用(如System.exit()、文件操作等)咨询

编辑:让我澄清我的问题


我不是在质疑安全经理的可能性。我只是问,安全检查是针对危险api单独进行的,还是针对每个方法调用进行的。在使用大量代码的应用程序中,哪个inturn会导致性能严重下降。

安全管理器使用策略文件查看哪些是允许的,哪些是不允许的。此策略文件确定的“危险”操作在执行期间被授予或拒绝

您可以在此处找到有关Sun/Oracle JVM默认策略的更多详细信息:


使用安全管理器,您可以控制对以下内容的访问:

  • 文件操作
  • 反射设备
  • 读/写IO
  • 线程/线程组操作
  • 套接字操作(侦听、接受等)
  • 创建自己的类加载器的能力
  • 对于每一个这样的东西,在SecurityManager中都有一个check*()方法


    要获得详尽的列表,请检查

    中的常量,只有在代码中有说明时,才会咨询SecurityManager。它不会对每一个操作都这样做

    例如,在
    运行时.exit
    中,您会看到咨询了SecurityManager:

    public void exit(int status) {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkExit(status);
    }
    Shutdown.exit(status);
    }
    
    类似地,在
    文件
    中,您将看到大多数方法都会咨询SecurityManager。例如:

    public boolean canWrite() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(path);
    }
    return fs.checkAccess(this, FileSystem.ACCESS_WRITE);
    }
    

    如果您正在编写一个可能“危险”的方法,那么您还应该咨询SecurityManager。

    因此,它不会检查诸如“System.out.println()”之类的无辜操作?@dogbane:那么,策略文件呢?根据jpkrohling的评论,难道安全经理不使用它来查看什么是允许的,什么是不允许的吗below@RubyDosa我相信它不会默认检查
    系统。out
    /
    err
    ;我已经发了帖子来证实这一点。