# 安全经理

> 原文： [https://docs.oracle.com/javase/tutorial/essential/environment/security.html](https://docs.oracle.com/javase/tutorial/essential/environment/security.html)

_ 安全管理器 _ 是定义应用程序安全策略的对象。此策略指定不安全或敏感的操作。安全策略不允许的任何操作都会导致 [`SecurityException`](https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityException.html) 被抛出。应用程序还可以查询其安全管理器以发现允许的操作。

通常，Web applet 与浏览器或 Java Web Start 插件提供的安全管理器一起运行。除非应用程序本身定义一个，否则其他类型的应用程序通常在没有安全管理器的情如果没有安全管理器，则该应用程序没有安全策略，并且没有任何限制。

本节介绍应用程序如何与现有安全管理器进行交互。有关更多详细信息，包括有关如何设计安全管理器的信息，请参阅[安全指南](https://docs.oracle.com/javase/8/docs/technotes/guides/security/index.html)。

## 与安全管理器交互

安全管理器是 [`SecurityManager`](https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html) 类型的对象;要获取对此对象的引用，请调用`System.getSecurityManager`。

```
SecurityManager appsm = System.getSecurityManager();

```

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

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

SecurityManager 类定义了许多用于验证其他类型操作的其他方法。例如，`SecurityManager.checkAccess`验证线程访问，`SecurityManager.checkPropertyAccess`验证对指定属性的访问。每个操作或一组操作都有自己的`检查 _XXX_ （）`方法。

此外，`检查 _XXX_ （）`方法的集合表示已经受到安全管理器保护的一组操作。通常，应用程序不必直接调用任何`检查 _XXX_ （）`方法。

## 认识到违反安全规定

在没有安全管理器的情况下，许多常规操作在使用安全管理器运行时都会抛出`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`](https://docs.oracle.com/javase/8/docs/api/java/security/AccessControlException.html) 是`SecurityException`的子类。