安全 Manager

安全 管理 器是为应用程序定义安全策略的对象。此策略指定了不安全或敏感的操作。安全策略不允许的任何操作都将引发SecurityException。应用程序还可以查询其安全 管理 器以发现允许哪些操作。

通常,WebServlets 运行时使用浏览器或 Java Web Start 插件提供的安全 管理 器。其他类型的应用程序通常无需安全 管理 器即可运行,除非应用程序本身定义了一个。如果没有安全 管理 器,则该应用程序没有安全策略,并且运行时没有限制。

本节说明应用程序如何与现有的安全 管理 器进行交互。有关更多详细信息,包括有关如何设计安全 管理 器的信息,请参阅Security Guide

与安全 管理 器进行交互

安全 管理 器是类型SecurityManager的对象;要获得对此对象的引用,请调用System.getSecurityManager

SecurityManager appsm = System.getSecurityManager();

如果没有安全 管理 器,则此方法返回null

一旦应用程序引用了安全 管理 器对象,它就可以请求权限来执行特定的操作。标准库中的许多类都这样做。例如,以退出状态终止 Java 虚拟机的System.exit调用SecurityManager.checkExit以确保当前线程有权关闭该应用程序。

SecurityManager 类定义了许多其他方法来验证其他类型的操作。例如,SecurityManager.checkAccess验证线程访问,而SecurityManager.checkPropertyAccess验证对指定属性的访问。每个操作或一组操作都有自己的checkXXX()方法。

此外,这组checkXXX()个方法代表已受安全 管理 器保护的一组操作。通常,应用程序不必直接调用任何checkXXX()方法。

认识到安全违规

与安全 管理 器一起运行时,许多没有安全 管理 器的常规操作都可能引发SecurityException。即使调用未记录为抛出SecurityException的方法,也是如此。例如,考虑以下用于读取文件的代码:

reader = new FileReader("xanadu.txt");

在没有安全 管理 器的情况下,只要xanadu.txt存在且可读,该语句就可以正确执行。但是,假设此语句插入了一个 WebServlets,该 Servlets 通常在不允许文件 Importing 的安全 管理 器下运行。可能会导致以下错误消息:

appletviewer fileApplet.html
Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.io.FilePermission characteroutput.txt write)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
        at java.io.FileWriter.<init>(FileWriter.java:46)
...

请注意,在这种情况下抛出的特定异常java.security.AccessControlExceptionSecurityException的子类。