# 安全管理器 (Security Manager)

安全管理器 是一个定义安全策略的对象。此策略指定不安全或敏感的操作。安全策略不允许的任何操作都会抛出 SecurityException 异常。 应用程序还可以查询其安全管理器允许哪些操作。

通常,Web 小程序与由浏览器或 Java Web Start 插件提供的安全管理器一起运行。其他类型的应用程序通常运行没有安全管理器, 除非应用程序本身定义一个。如果没有安全管理员,应用程序没有安全策略,没有限制。

本节介绍应用程序如何与现有安全管理器进行交互。有关详细信息,包括有关如何设计安全管理器的信息, 请参阅“ 安全指南”。

# 与安全管理器进行交互

SecurityManager 是一个安全管理器, 通过调用 System.getSecurityManager 来获得实例

SecurityManager appsm = System.getSecurityManager();
1

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

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

SecurityManager 类定义了许多用于验证其他类型操作的其他方法。例如,SecurityManager.checkAccess 验证线程访问, SecurityManager.checkPropertyAccess 验证对指定属性的访问。每个操作或一组操作有自己的 checkXXX() 方法, 此外,该组方法标识已经收到安全管理器保护的一组操作。通常,应用程序不需要直接调用任何 checkXXX()方法.

# 认识违反安全的行为

许多没有安全管理器的常规操作可能会抛出 SecurityException 运行时异常。例如,考虑以下用于读取文件的代码:

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

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

applet 没有接触过,不深入了。