文档

Java™教程
隐藏目录
安全管理器
路径:基本Java类
课程:平台环境
章节:系统实用工具

安全管理器

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

通常情况下,一个web applet会在浏览器或Java Web Start插件提供的安全管理器下运行。其他类型的应用程序通常在没有安全管理器的情况下运行,除非应用程序自己定义了一个。如果没有安全管理器存在,应用程序就没有安全策略,可以无限制地执行操作。

本节解释了应用程序如何与现有的安全管理器交互。有关更详细的信息,包括如何设计安全管理器的信息,请参阅安全指南

与安全管理器交互

安全管理器是一个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 FileWriter("xanadu.txt");

在没有安全管理器的情况下,该语句会执行而不报错,前提是xanadu.txt存在并且可写。但是假设将此语句插入到一个通常在安全管理器下运行且不允许文件输出的Web小程序中,可能会出现以下错误信息:

appletviewer fileApplet.html
    Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.io.FilePermission xanadu.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的子类。


上一页:系统属性
下一页:System 中的其他方法