一个安全管理器(security manager是一个对象,定义安全策略的应用程序。此策略指定了不安全或敏感的操作。安全策略不允许的任何操作都会抛出SecurityException。应用程序还可以查询其安全管理器以发现允许哪些操作。
通常,Web小程序运行时使用浏览器或Java Web Start插件提供的安全管理器。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序本身定义了一个。如果不存在安全管理器,则该应用程序没有安全策略,并且运行时没有限制。
本节说明应用程序如何与现有的安全管理器进行交互。有关更多详细信息,包括有关如何设计安全管理器的信息,请参阅 安全指南

与安全管理器进行交互

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

  1. SecurityManager appsm = System.getSecurityManager();

如果没有安全管理器,则此方法返回null
一旦应用程序引用了安全管理器对象,它就可以请求权限来执行特定的操作。标准库中的许多类都这样做。例如,以退出状态终止Java虚拟机的System.exit调用SecurityManager.checkExit以确保当前线程有权关闭该应用程序。
SecurityManager类定义了许多其他方法来验证其他类型的操作。例如,SecurityManager.checkAccess验证线程访问,而SecurityManager.checkPropertyAccess验证对指定属性的访问。每个操作或一组操作都有其自己的check_XXX_()方法。
此外,这组check_XXX_()方法表示这组操作受安全管理器保护。通常,应用程序不必直接调用任何check_XXX_()方法。

识别安全违规

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

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

在没有安全管理器的情况下,只要xanadu.txt存在并且可读,该语句就可以无错误地执行。但是,假设此语句插入到Web小程序中,该Web小程序通常在不允许文件输入的安全管理器下运行。可能会导致以下错误消息:

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

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