一个安全管理器(security manager)是一个对象,定义安全策略的应用程序。此策略指定了不安全或敏感的操作。安全策略不允许的任何操作都会抛出SecurityException
。应用程序还可以查询其安全管理器以发现允许哪些操作。
通常,Web小程序运行时使用浏览器或Java Web Start插件提供的安全管理器。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序本身定义了一个。如果不存在安全管理器,则该应用程序没有安全策略,并且运行时没有限制。
本节说明应用程序如何与现有的安全管理器进行交互。有关更多详细信息,包括有关如何设计安全管理器的信息,请参阅 安全指南。
与安全管理器进行交互
安全管理器是SecurityManager
类型的对象; 要获取对此对象的引用,请调用System.getSecurityManager
。
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
的方法,也是如此。例如,考虑以下用于读取文件的代码:
reader = new FileReader("xanadu.txt");
在没有安全管理器的情况下,只要xanadu.txt
存在并且可读,该语句就可以无错误地执行。但是,假设此语句插入到Web小程序中,该Web小程序通常在不允许文件输入的安全管理器下运行。可能会导致以下错误消息:
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
的子类。