SecurityManager sm = System.getSecurityManager();
安全管理器是允许应用程序实施安全策略的类。 它允许应用程序在执行可能不安全或敏感的操作之前确定操 作是什么以及是否在允许执行操作的安全上下文中尝试。 应用程序可以允许或禁止操作。
SecurityManager类包含许多方法,名称以check 。 在这些方法执行某些潜在的敏感操作之前,这些方法在Java库中被各种方法所调用。 调用这样的check方法通常如下所示:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
因此,安全管理员有机会通过抛出异常来防止操作完成。 安全管理器例程只是简单地返回如果允许在运行,但抛出一个SecurityException如果操作是不允许的。 这个惯例的唯一例外是checkTopLevelWindow ,它返回一个boolean值。
当前的安全管理器由setSecurityManager方法在System类中System 。 当前的安全管理器是通过getSecurityManager方法获得的。
特殊方法checkPermission(java.security.Permission)确定是否应该授予或拒绝由指定许可表示的访问请求。 默认实现调用
AccessController.checkPermission(perm); 如果允许访问请求, checkPermission安静地返回。 如果被拒绝,则会抛出一个SecurityException 。
从Java 2 SDK v1.2开始,SecurityManager中的其他check方法的SecurityManager是调用SecurityManager checkPermission方法来确定调用线程是否具有执行请求操作的权限。
请注意,只有一个权限参数的checkPermission方法总是在当前执行的线程的上下文中执行安全检查。 有时,在特定上下文中应该进行的安全检查实际上需要在不同的上下文(例如,从工作线程中)完成。 提供了包含上下文参数的getSecurityContext方法和checkPermission方法。 getSecurityContext方法返回当前调用上下文的“快照”。 (默认实现返回一个AccessControlContext对象。)示例调用如下:
Object context = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) context = sm.getSecurityContext();
- 除了checkPermission ,接受上下文对象的checkPermission方法使得基于该上下文而不是当前执行线程的访问决策。 因此,不同上下文中的代码可以调用该方法,传递权限和先前保存的上下文对象。 使用前面示例中获得的SecurityManager sm进行的示例呼叫如下所示:
if (sm != null)
sm.checkPermission(permission, context);
权限属于这些类别:文件,套接字,网络,安全,运行时,属性,AWT,反射和可序列化。 管理这些不同的权限类别类是 java.io.FilePermission , java.net.SocketPermission , java.net.NetPermission , java.security.SecurityPermission , java.lang.RuntimePermission , java.util.PropertyPermission , java.awt.AWTPermission , java.lang.reflect.ReflectPermission和java.io.SerializablePermission 。
除了前两个(FilePermission和SocketPermission)之外的java.security.BasicPermission子类都是java.security.BasicPermission的子类,它本身是顶级类的一个抽象子类,它是java.security.Permission 。 BasicPermission定义了包含层次化属性命名约定(例如“exitVM”,“setFactory”,“queuePrintJob”等)之后的名称的所有权限所需的功能。 名称后面可能会出现星号,后跟“。”,或本身表示通配符。 例如:“a。”或“”有效,“* a”或“a * b”无效。
FilePermission和SocketPermission是用于权限的顶级类的子类( java.security.Permission )。 类似于这些类,它们的名称语法比BasicPermission子类直接来自Permission而不是BasicPermission所使用的语法更复杂。 例如,对于java.io.FilePermission对象,权限名称是文件(或目录)的路径名。
一些权限类有一个“操作”列表,用于告知对象允许的操作。 例如,对于java.io.FilePermission对象,操作列表(例如“读取,写入”)指定为指定的文件(或指定目录中的文件)授予哪些操作。
其他许可类用于“命名”权限 - 包含名称但不包含操作列表的权限类; 你有指定的权限,或者你没有。
注意:还有一个java.security.AllPermission所有权限的java.security.AllPermission权限。 它存在以简化可能需要执行需要所有(或多个)权限的多个任务的系统管理员的工作。
有关权限相关信息,请参阅Permissions in the JDK。 本文档包括例如列出各种SecurityManager check方法的表以及每种此类方法的默认实现所需的权限。 它还包含需要权限的所有版本1.2方法的表,并且对于每个这样的方法来说明它需要哪个权限。
返回类型 | 方法名 | 方法描述 |
---|---|---|
void | checkAccept(String host, int port) | 如果调用线程不允许从指定的主机和端口号接受套接字连接,则抛出一个 SecurityException 。 |
void | checkAccess(Thread t) | 如果调用线程不允许修改线程参数,则抛出一个 SecurityException 。 |
void | checkAccess(ThreadGroup g) | 如果调用线程不允许修改线程组参数,则抛出一个 SecurityException 。 |
void | checkAwtEventQueueAccess() | 已弃用 对AWTPermission的依赖性对未来Java平台的AWTPermission造成了障碍。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改,以检查权限java.security.AllPermission 。 |
void | checkConnect(String host, int port) | 如果调用线程不允许打开与指定的主机和端口号的套接字连接,则抛出一个 SecurityException 。 |
void | checkConnect(String host, int port, Object context) | 如果指定的安全上下文不允许打开到指定的主机和端口号的套接字连接,则抛出一个 SecurityException 。 |
void | checkCreateClassLoader() | 如果调用线程不允许创建新的类加载器,则抛出一个 SecurityException 。 |
void | checkDelete(String file) | 如果调用线程不允许删除指定的文件,则抛出一个 SecurityException 。 |
void | checkExec(String cmd) | 抛出 SecurityException如果调用线程不允许创建子进程。 |
void | checkExit(int status) | 如果不允许调用线程使Java虚拟机停止指定的状态代码,则抛出一个 SecurityException 。 |
void | checkLink(String lib) | 如果调用线程不允许动态链接由字符串参数文件指定的库代码,则抛出一个 SecurityException 。 |
void | checkListen(int port) | 抛出 SecurityException如果调用线程不允许等待与指定的端口号的连接请求。 |
void | checkMemberAccess(类 clazz, int which) | 已弃用 该方法依赖于调用者的堆栈深度为4,容易出错,并且不能由运行时执行。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改,以检查权限java.security.AllPermission 。 |
void | checkMulticast(InetAddress maddr) | 抛出 SecurityException如果调用线程不允许使用(加入/离开/发送/接收)IP多播。 |
void | checkMulticast(InetAddress maddr, byte ttl) | 已弃用 请改用#checkPermission(java.security.Permission) |
void | checkPackageAccess(String pkg) | 如果调用线程不允许访问由参数指定的包,则抛出一个 SecurityException 。 |
void | checkPackageDefinition(String pkg) | 如果调用线程不允许在参数指定的包中定义类,则抛出一个 SecurityException 。 |
void | checkPermission(Permission perm) | 如果根据当前有效的安全策略不允许由给定权限指定的请求访问,则抛出 SecurityException 。 |
void | checkPermission(Permission perm, Object context) | 抛出 SecurityException如果指定的安全上下文被拒绝访问由给定权限所指定的资源。 |
void | checkPrintJobAccess() | 如果调用线程不允许启动打印作业请求,则抛出一个 SecurityException 。 |
void | checkPropertiesAccess() | 抛出 SecurityException如果调用线程不允许访问或修改系统属性。 |
void | checkPropertyAccess(String key) | 如果调用线程不允许访问具有指定的 key名称的系统属性,则抛出一个 SecurityException 。 |
void | checkRead(FileDescriptor fd) | 抛出 SecurityException如果调用线程不允许从指定的文件进行读取。 |
void | checkRead(String file) | 如果调用线程不允许读取字符串参数指定的文件,则抛出一个 SecurityException 。 |
void | checkRead(String file, Object context) | 如果指定的安全上下文不允许读取由字符串参数指定的文件,则抛出一个 SecurityException 。 |
void | checkSecurityAccess(String target) | 确定是否应授予或拒绝具有指定权限目标名称的权限。 |
void | checkSetFactory() | 抛出 SecurityException如果调用线程不允许设置由使用的套接字工厂 ServerSocket或 Socket ,或使用的流处理程序工厂 URL 。 |
void | checkSystemClipboardAccess() | 已弃用 对AWTPermission的依赖性为Java平台未来的AWTPermission创造了障碍。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改,以检查权限java.security.AllPermission 。 |
boolean | checkTopLevelWindow(Object window) | 已弃用 对AWTPermission的依赖性为Java平台的未来AWTPermission创造了障碍。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改以检查权限java.security.AllPermission 。 |
void | checkWrite(FileDescriptor fd) | 抛出 SecurityException如果调用线程不允许写入指定的文件描述符。 |
void | checkWrite(String file) | 如果调用线程不允许写入由字符串参数指定的文件,则抛出一个 SecurityException 。 |
protected int | classDepth(String name) | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission调用。 |
protected int | classLoaderDepth() | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission呼叫。 |
protected ClassLoader | currentClassLoader() | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission通话。 |
protected 类 | currentLoadedClass() | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission通话。 |
protected 类[] | getClassContext() | 将当前执行堆栈作为一个类的数组返回。 |
boolean | getInCheck() | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission调用。 |
Object | getSecurityContext() | 创建封装当前执行环境的对象。 |
ThreadGroup | getThreadGroup() | 返回要在其被调用时实例化任何正在创建的新线程的线程组。 |
protected boolean | inClass(String name) | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission呼叫。 |
protected boolean | inClassLoader() | 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission通话。 |