Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
security manager (安全管理器) 是定义应用程序安全策略的对象。此策略指定不安全或敏感的操作。安全策略不允许的任何操作都会导致抛出 SecurityException
。应用程序还可以查询其安全管理器以发现允许的操作。
通常,Web applet 与浏览器或 Java Web Start 插件提供的安全管理器一起运行。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序本身定义了安全管理器。如果没有安全管理器,则该应用程序没有安全策略,并且没有任何限制。
本节介绍应用程序如何与现有安全管理器进行交互。有关更多详细信息,包括有关如何设计安全管理器的信息,请参阅 Security Guide。
安全管理器是 SecurityManager
类型的对象;要获取对此对象的引用,请调用 System.getSecurityManager
。
SecurityManager appsm = System.getSecurityManager();
如果没有安全管理器,则此方法返回 null
。
一旦应用程序具有对安全管理器对象的引用,它就可以请求执行特定事务的权限。标准库中的许多类都是这样做的。例如,System.exit
,它带退出状态终止 Java 虚拟机,调用 SecurityManager.checkExit
以确保当前线程有权关闭应用程序。
SecurityManager 类定义了许多用于验证其他类型操作的其他方法。例如,SecurityManager.checkAccess
验证线程访问,SecurityManager.checkPropertyAccess
验证对指定属性的访问。每个操作或一组操作都有自己的 checkXXX()
方法。
此外,checkXXX()
方法的集合表示已受安全管理器保护的操作集。通常,应用程序不必直接调用任何 checkXXX()
方法。
在没有安全管理器的情况下的许多常规操作,在使用安全管理器运行时都会抛出 SecurityException
。即使在调用未记录为抛出 SecurityException
的方法时也是如此。例如,请考虑以下用于读取文件的代码:
reader = new FileReader("xanadu.txt");
在没有安全管理器的情况下,如果 xanadu.txt
存在且可读,则此语句无错误地执行。但是假设此语句插入到 Web applet 中,该 applet 通常在不允许文件输入的安全管理器下运行。可能会导致以下错误消息:
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.AccessControlException
是 SecurityException
的子类。