鸿蒙OS SecurityManager
SecurityManager
java.lang.Object
|---java.lang.SecurityManager
public class SecurityManager
extends Object
安全管理器是一个允许应用程序实现安全策略的类。 它允许应用程序在执行可能不安全或敏感的操作之前确定该操作是什么以及是否在允许执行该操作的安全上下文中尝试该操作。 应用程序可以允许或禁止该操作。
SecurityManager 类包含许多名称以单词 check 开头的方法。 在这些方法执行某些潜在敏感操作之前,这些方法由 Java 库中的各种方法调用。 这种检查方法的调用通常如下所示:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
因此,安全管理器有机会通过抛出异常来阻止操作完成。 如果操作被允许,安全管理器例程会简单地返回,但如果操作不被允许,则抛出 SecurityException。 此约定的唯一例外是 checkTopLevelWindow,它返回一个布尔值。
当前的安全管理器由 System.class 中的 setSecurityManager 方法设置。 当前的安全管理器通过 getSecurityManager 方法获取。
特殊方法 SecurityManager#checkPermission(java.security.Permission) 确定是否应授予或拒绝由指定权限指示的访问请求。 默认实现调用
AccessController.checkPermission(perm);
如果请求的访问被允许,checkPermission 会安静地返回。如果被拒绝,则会引发 SecurityException。
从 Java 2 SDK v1.2 开始,SecurityManager 中其他每个检查方法的默认实现是调用 SecurityManager 的 checkPermission 方法来确定调用线程是否有权执行请求的操作。
请注意,只有一个权限参数的 checkPermission 方法总是在当前执行线程的上下文中执行安全检查。有时,应该在给定上下文中进行的安全检查实际上需要在不同的上下文中进行(例如,从工作线程中)。针对这种情况提供了包含上下文参数的 SecurityManager#getSecurityContext 方法和 SecurityManager#checkPermission(java.security.Permission, java.lang.Object) 方法。 getSecurityContext 方法返回当前调用上下文的“快照”。 (默认实现返回一个 AccessControlContext 对象。)示例调用如下:
Object context = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) context = sm.getSecurityContext();
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.Permission 的抽象子类。 BasicPermission 定义了包含遵循分层属性命名约定的名称的所有权限所需的功能(例如,“exitVM”、“setFactory”、“queuePrintJob”等)。星号可能出现在名称的末尾,跟在“.”之后,或者单独出现,表示通配符匹配。例如:“一”。 or "" 有效,"a" 或 "ab" 无效。
FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。与 BasicPermission 子类直接从 Permission 而不是从 BasicPermission 中使用的类相比,此类具有更复杂的名称语法。例如,对于 java.io.FilePermission 对象,权限名称是文件(或目录)的路径名。
一些权限类有一个“动作”列表,它告诉对象允许的动作。例如,对于 java.io.FilePermission 对象,操作列表(例如“读、写”)指定为指定文件(或指定目录中的文件)授予哪些操作。
其他权限类用于“命名”权限 - 包含名称但没有操作列表的权限;您要么拥有命名权限,要么没有。
注意:还有一个 java.security.AllPermission 权限意味着所有权限。它的存在是为了简化可能需要执行需要全部(或大量)权限的多项任务的系统管理员的工作。
字段摘要
修饰符和类型 | 字段 | 描述 |
---|---|---|
protected boolean | inCheck | 已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。 |
构造函数摘要
构造函数 | 描述 |
---|---|
SecurityManager() | 构造一个新的 SecurityManager。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
void | checkAccept(String host, int port) | 如果不允许调用线程接受来自指定主机和端口号的套接字连接,则抛出 SecurityException。 |
void | checkAccess(Thread t) | 如果不允许调用线程修改线程参数,则抛出 SecurityException。 |
void | checkAccess(ThreadGroup g) | 如果不允许调用线程修改线程组参数,则抛出 SecurityException。 |
void | checkAwtEventQueueAccess() | 已弃用。 对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。 此方法的用户应改为直接调用 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(Class<?> clazz, int which) | 已弃用。 此方法依赖于调用者处于 4 的堆栈深度,这很容易出错并且不能由运行时强制执行。 此方法的用户应改为直接调用 checkPermission(java.security.Permission)。 此方法将在未来版本中更改以检查权限 java.security.AllPermission。 |
void | checkMulticast(InetAddress maddr) | 如果不允许调用线程使用(加入/离开/发送/接收)IP 多播,则抛出 SecurityException。 |
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) | 如果不允许调用线程访问具有指定键名的系统属性,则抛出 SecurityException。 |
void | checkRead(FileDescriptor fd) | 如果不允许调用线程从指定的文件描述符中读取,则抛出 SecurityException。 |
void | checkRead(String file) | 如果不允许调用线程读取由字符串参数指定的文件,则抛出 SecurityException。 |
void | checkRead(String file, Object context) | 如果不允许指定的安全上下文读取字符串参数指定的文件,则抛出 SecurityException。 |
void | checkSecurityAccess(String target) | 确定是否应授予或拒绝具有指定权限目标名称的权限。 |
void | checkSetFactory() | 如果不允许调用线程设置 ServerSocket 或 Socket 使用的套接字工厂或 URL 使用的流处理程序工厂,则抛出 SecurityException。 |
void | checkSystemClipboardAccess() | 已弃用。 对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。 此方法的用户应改为直接调用 checkPermission(java.security.Permission)。 此方法将在未来版本中更改以检查权限 java.security.AllPermission。 |
boolean | checkTopLevelWindow(Object window) | 已弃用。 对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。 此方法的用户应改为直接调用 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 Class<?> | currentLoadedClass() | 已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。 |
protected Class[] | getClassContext() | 以类数组的形式返回当前执行堆栈。 |
boolean | getInCheck() | 已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。 |
Object | getSecurityContext() | 创建一个封装当前执行环境的对象。 |
ThreadGroup | getThreadGroup() | 返回线程组,在该线程组中实例化在调用它时创建的任何新线程。 |
protected boolean | inClass(String name) | 已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。 |
protected boolean | inClassLoader() | 已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息
inCheck
@Deprecated protected boolean inCheck
已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。
如果正在进行安全检查,则该字段为 true; 否则为 false。
构造函数详细信息
SecurityManager
public SecurityManager()
构造一个新的 SecurityManager。
如果已经安装了安全管理器,该方法首先调用安全管理器的 checkPermission 方法,具有 RuntimePermission("createSecurityManager") 权限,以确保调用线程具有创建新安全管理器的权限。 这可能会导致抛出 SecurityException。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果安全管理器已经存在并且其 checkPermission 方法不允许创建新的安全管理器。 |
方法详情
getInCheck
@Deprecated public boolean getInCheck()
已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。
测试是否正在进行安全检查。
返回:
inCheck 字段的值。 如果正在进行安全检查,则该字段应包含 true,否则为 false。
getClassContext
protected Class[] getClassContext()
以类数组的形式返回当前执行堆栈。
数组的长度是执行堆栈上的方法数。 索引 0 处的元素是当前执行方法的类,索引 1 处的元素是该方法调用者的类,依此类推。
返回:
执行堆栈。
currentClassLoader
@Deprecated protected ClassLoader currentClassLoader()
已弃用。不推荐这种类型的安全检查。建议改用 checkPermission 调用。
从使用非系统类加载器定义的类中返回最近执行的方法的类加载器。非系统类加载器被定义为不等于系统类加载器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的类加载器。
该方法将在以下三种情况下返回 null:
- 执行堆栈上的所有方法都来自使用系统类加载器或其祖先之一定义的类。
- 执行堆栈上的所有方法直到第一个“特权”调用者(参见 AccessController.doPrivileged(java.security.PrivilegedAction))都来自使用系统类加载器或其祖先之一定义的类。
- 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。
返回:
使用非系统类加载器定义的类的方法堆栈上最近出现的类加载器。
currentLoadedClass
@Deprecated protected Class<?> currentLoadedClass()
已弃用。不推荐这种类型的安全检查。建议改用 checkPermission 调用。
从使用非系统类加载器定义的类中返回最近执行的方法的类。非系统类加载器被定义为不等于系统类加载器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的类加载器。
该方法将在以下三种情况下返回 null:
- 执行堆栈上的所有方法都来自使用系统类加载器或其祖先之一定义的类。
- 执行堆栈上的所有方法直到第一个“特权”调用者(参见 AccessController.doPrivileged(java.security.PrivilegedAction))都来自使用系统类加载器或其祖先之一定义的类。
- 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。
返回:
使用非系统类加载器定义的类的方法堆栈上最近出现的类。
classDepth
@Deprecated protected int classDepth(String name)
已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。
返回指定类的堆栈深度。
参数:
参数名称 | 参数描述 |
---|---|
name | 要搜索的类的完全限定名称。 |
返回:
具有指定名称的类中第一次出现方法的堆栈帧深度; -1 如果找不到这样的框架。
classLoaderDepth
@Deprecated protected int classLoaderDepth()
已弃用。不推荐这种类型的安全检查。建议改用 checkPermission 调用。
返回使用非系统类加载器定义的类中最近执行的方法的堆栈深度。非系统类加载器被定义为不等于系统类加载器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的类加载器。
此方法将在以下三种情况下返回 -1:
- 执行堆栈上的所有方法都来自使用系统类加载器或其祖先之一定义的类。
- 执行堆栈上的所有方法直到第一个“特权”调用者(参见 AccessController.doPrivileged(java.security.PrivilegedAction))都来自使用系统类加载器或其祖先之一定义的类。
- 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。
返回:
使用非系统类加载器定义的类中最近出现的方法的堆栈帧深度。
inClass
@Deprecated protected boolean inClass(String name)
已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。
测试具有指定名称的类中的方法是否在执行堆栈上。
参数:
参数名称 | 参数描述 |
---|---|
name | 类的完全限定名。 |
返回:
如果具有指定名称的类中的方法在执行堆栈上,则为 true; 否则为假。
inClassLoader
@Deprecated protected boolean inClassLoader()
已弃用。 不推荐这种类型的安全检查。 建议改用 checkPermission 调用。
基本上,测试使用类加载器定义的类中的方法是否在执行堆栈上。
返回:
如果对 currentClassLoader 的调用具有非空返回值,则为 true。
getSecurityContext
public Object getSecurityContext()
创建一个封装当前执行环境的对象。 例如,三参数 checkConnect 方法和二参数 checkRead 方法使用此方法的结果。 这些方法是必需的,因为可以调用受信任的方法来读取文件或代表另一个方法打开套接字。 受信任的方法需要确定是否允许其他(可能不受信任的)方法自行执行操作。
此方法的默认实现是返回一个 AccessControlContext 对象。
返回:
一个依赖于实现的对象,它封装了有关当前执行环境的足够信息,以便稍后执行一些安全检查。
checkPermission
public void checkPermission(Permission perm)
如果根据当前有效的安全策略不允许由给定权限指定的请求访问,则引发 SecurityException。
此方法使用给定的权限调用 AccessController.checkPermission。
参数:
参数名称 | 参数描述 |
---|---|
perm | 请求的权限。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果根据当前的安全策略不允许访问。 |
NullPointerException | 如果权限参数为空。 |
checkPermission
public void checkPermission(Permission perm, Object context)
如果指定的安全上下文被拒绝访问由给定权限指定的资源,则引发 SecurityException。 上下文必须是先前调用 getSecurityContext 返回的安全上下文,并且访问控制决策基于为该安全上下文配置的安全策略。
如果 context 是 AccessControlContext 的实例,则使用指定的权限调用 AccessControlContext.checkPermission 方法。
如果 context 不是 AccessControlContext 的实例,则抛出 SecurityException。
参数:
参数名称 | 参数描述 |
---|---|
perm | 指定的权限 |
context | 依赖于系统的安全上下文。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的实例(例如,为null),或者被拒绝访问由给定权限指定的资源。 |
NullPointerException | 如果权限参数为null。 |
checkCreateClassLoader
public void checkCreateClassLoader()
如果不允许调用线程创建新的类加载器,则抛出 SecurityException。
此方法使用 RuntimePermission("createClassLoader") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkCreateClassLoader。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有创建新类加载器的权限。 |
checkAccess
public void checkAccess(Thread t)
如果不允许调用线程修改线程参数,则抛出 SecurityException。
此方法由 Thread 类的 stop、suspend、resume、setPriority、setName 和 setDaemon 方法为当前安全管理器调用。
如果线程参数是系统线程(属于具有 null 父级的线程组),则此方法使用 RuntimePermission("modifyThread") 权限调用 checkPermission。如果线程参数不是系统线程,则此方法只是静默返回。
需要更严格策略的应用程序应覆盖此方法。如果此方法被覆盖,则覆盖它的方法应另外检查调用线程是否具有 RuntimePermission("modifyThread") 权限,如果是,则静默返回。这是为了确保授予该权限的代码(例如 JDK 本身)可以操作任何线程。
如果此方法被覆盖,则 super.checkAccess 应由被覆盖方法中的第一条语句调用,或者应在被覆盖方法中放置等效的安全检查。
参数:
参数名称 | 参数描述 |
---|---|
t | 要检查的线程。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有修改线程的权限。 |
NullPointerException | 如果线程参数为空。 |
checkAccess
public void checkAccess(ThreadGroup g)
如果不允许调用线程修改线程组参数,则抛出 SecurityException。
当创建新的子线程或子线程组时,通过 ThreadGroup 类的 setDaemon、setMaxPriority、stop、suspend、resume 和 destroy 方法为当前安全管理器调用此方法。
如果线程组参数是系统线程组(具有 null 父级),则此方法使用 RuntimePermission("modifyThreadGroup") 权限调用 checkPermission。如果线程组参数不是系统线程组,则此方法只是静默返回。
需要更严格策略的应用程序应覆盖此方法。如果此方法被覆盖,则覆盖它的方法应另外检查调用线程是否具有 RuntimePermission("modifyThreadGroup") 权限,如果是,则静默返回。这是为了确保授予该权限的代码(例如 JDK 本身)可以操作任何线程。
如果此方法被覆盖,则 super.checkAccess 应由被覆盖方法中的第一条语句调用,或者应在被覆盖方法中放置等效的安全检查。
参数:
参数名称 | 参数描述 |
---|---|
g | 要检查的线程组。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有修改线程组的权限。 |
NullPointerException | 如果线程组参数为空。 |
checkExit
public void checkExit(int status)
如果不允许调用线程导致 Java 虚拟机以指定的状态码停止,则抛出 SecurityException。
该方法由 Runtime 类的 exit 方法为当前安全管理器调用。 状态为 0 表示成功; 其他值表示各种错误。
此方法使用 RuntimePermission("exitVM."+status) 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的地方调用 super.checkExit。
参数:
参数名称 | 参数描述 |
---|---|
status | 退出状态。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有权限以指定状态暂停 Java 虚拟机。 |
checkExec
public void checkExec(String cmd)
如果不允许调用线程创建子进程,则抛出 SecurityException。
此方法由 Runtime 类的 exec 方法为当前安全管理器调用。
如果 cmd 是绝对路径,则此方法使用 FilePermission(cmd,"execute") 权限调用 checkPermission,否则使用 FilePermission("<<ALL FILES>>","execute") 调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkExec。
参数:
参数名称 | 参数描述 |
---|---|
cmd | 指定的系统命令。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有创建子进程的权限。 |
NullPointerException | 如果 cmd 参数为空。 |
checkLink
public void checkLink(String lib)
如果不允许调用线程动态链接字符串参数文件指定的库代码,则抛出 SecurityException。 参数要么是一个简单的库名,要么是一个完整的文件名。
该方法由 Runtime 类的 load 和 loadLibrary 方法为当前安全管理器调用。
此方法使用 RuntimePermission("loadLibrary."+lib) 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkLink。
参数:
参数名称 | 参数描述 |
---|---|
lib | 库的名称。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有动态链接库的权限。 |
NullPointerException | 如果 lib 参数为空。 |
checkRead
public void checkRead(FileDescriptor fd)
如果不允许调用线程从指定的文件描述符中读取,则抛出 SecurityException。
此方法使用 RuntimePermission("readFileDescriptor") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkRead。
参数:
参数名称 | 参数描述 |
---|---|
fd | 系统相关的文件描述符。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定文件描述符的权限。 |
NullPointerException | 如果文件描述符参数为空。 |
checkRead
public void checkRead(String file)
如果不允许调用线程读取由字符串参数指定的文件,则抛出 SecurityException。
此方法使用 FilePermission(file,"read") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkRead。
参数:
参数名称 | 参数描述 |
---|---|
file | 系统相关的文件名。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定文件的权限。 |
NullPointerException | 如果文件参数为空。 |
checkRead
public void checkRead(String file, Object context)
如果不允许指定的安全上下文读取字符串参数指定的文件,则抛出 SecurityException。 上下文必须是先前调用 getSecurityContext 返回的安全上下文。
如果 context 是 AccessControlContext 的一个实例,那么将使用 FilePermission(file,"read") 权限调用 AccessControlContext.checkPermission 方法。
如果 context 不是 AccessControlContext 的实例,则抛出 SecurityException。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkRead。
参数:
参数名称 | 参数描述 |
---|---|
file | 系统相关的文件名。 |
context | 依赖于系统的安全上下文。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的实例(例如,为 null),或者没有读取指定文件的权限。 |
NullPointerException | 如果文件参数为空。 |
checkWrite
public void checkWrite(FileDescriptor fd)
如果不允许调用线程写入指定的文件描述符,则抛出 SecurityException。
此方法使用 RuntimePermission("writeFileDescriptor") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkWrite。
参数:
参数名称 | 参数描述 |
---|---|
fd | 系统相关的文件描述符。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定文件描述符的权限。 |
NullPointerException | 如果文件描述符参数为空。 |
checkWrite
public void checkWrite(String file)
如果不允许调用线程写入由字符串参数指定的文件,则抛出 SecurityException。
此方法使用 FilePermission(file,"write") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkWrite。
参数:
参数名称 | 参数描述 |
---|---|
file | 系统相关的文件名。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定文件的权限。 |
NullPointerException | 如果文件参数为空。 |
checkDelete
public void checkDelete(String file)
如果不允许调用线程删除指定文件,则抛出 SecurityException。
该方法由 File 类的 delete 方法为当前安全管理器调用。
此方法使用 FilePermission(file,"delete") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkDelete。
参数:
参数名称 | 参数描述 |
---|---|
file | 系统相关的文件名。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有删除文件的权限。 |
NullPointerException | 如果文件参数为空。 |
checkConnect
public void checkConnect(String host, int port)
如果不允许调用线程打开到指定主机和端口号的套接字连接,则抛出 SecurityException。
端口号 -1 表示调用方法正在尝试确定指定主机名的 IP 地址。
如果端口不等于 -1,则此方法使用 SocketPermission(host+":"+port,"connect") 权限调用 checkPermission。 如果端口等于 -1,那么它会调用带有 SocketPermission(host,"resolve") 权限的 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的地方调用 super.checkConnect。
参数:
参数名称 | 参数描述 |
---|---|
host | 要连接的主机名端口。 |
port | 要连接的协议端口。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程无权打开到指定主机和端口的套接字连接。 |
NullPointerException | 如果主机参数为空。 |
checkConnect
public void checkConnect(String host, int port, Object context)
如果不允许指定的安全上下文打开到指定主机和端口号的套接字连接,则抛出 SecurityException。
端口号 -1 表示调用方法正在尝试确定指定主机名的 IP 地址。
如果 context 不是 AccessControlContext 的实例,则抛出 SecurityException。
否则,检查端口号。 如果不等于 -1,则使用 SocketPermission(host+":"+port,"connect") 权限调用上下文的 checkPermission 方法。 如果端口等于 -1,则使用 SocketPermission(host,"resolve") 权限调用上下文的 checkPermission 方法。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的地方调用 super.checkConnect。
参数:
参数名称 | 参数描述 |
---|---|
host | 要连接的主机名端口。 |
port | 要连接的协议端口。 |
context | 依赖于系统的安全上下文。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的实例(例如,为 null),或者无权打开到指定主机和端口的套接字连接。 |
NullPointerException | 如果主机参数为空。 |
checkListen
public void checkListen(int port)
如果不允许调用线程在指定的本地端口号上等待连接请求,则抛出 SecurityException。
此方法使用 SocketPermission("localhost:"+port,"listen") 调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的地方调用 super.checkListen。
参数:
参数名称 | 参数描述 |
---|---|
port | 本地端口。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有权限监听指定端口。 |
checkAccept
public void checkAccept(String host, int port)
如果不允许调用线程接受来自指定主机和端口号的套接字连接,则抛出 SecurityException。
该方法由ServerSocket 类的accept 方法为当前的安全管理器调用。
此方法使用 SocketPermission(host+":"+port,"accept") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkAccept。
参数:
参数名称 | 参数描述 |
---|---|
host | 套接字连接的主机名。 |
port | 套接字连接的端口号。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有接受连接的权限。 |
NullPointerException | 如果主机参数为空。 |
checkMulticast
public void checkMulticast(InetAddress maddr)
如果不允许调用线程使用(加入/离开/发送/接收)IP 多播,则抛出 SecurityException。
此方法使用 java.net.SocketPermission(maddr.getHostAddress(), "accept,connect") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkMulticast。
参数:
参数名称 | 参数描述 |
---|---|
maddr | 要使用的 Internet 组地址。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果不允许调用线程使用(加入/离开/发送/接收)IP 多播。 |
NullPointerException | 如果地址参数为空。 |
checkMulticast
@Deprecated public void checkMulticast(InetAddress maddr, byte ttl)
已弃用。 改用#checkPermission(java.security.Permission)
如果不允许调用线程使用(加入/离开/发送/接收)IP 多播,则抛出 SecurityException。
此方法使用 java.net.SocketPermission(maddr.getHostAddress(), "accept,connect") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkMulticast。
参数:
参数名称 | 参数描述 |
---|---|
maddr | 要使用的 Internet 组地址。 |
ttl | 使用中的值,如果是多播发送。 注意:此特定实现不使用 ttl 参数。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果不允许调用线程使用(加入/离开/发送/接收)IP 多播。 |
NullPointerException | 如果地址参数为空。 |
checkPropertiesAccess
public void checkPropertiesAccess()
如果不允许调用线程访问或修改系统属性,则抛出 SecurityException。
此方法由 System 类的 getProperties 和 setProperties 方法使用。
此方法使用 PropertyPermission("*", "read,write") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkPropertiesAccess。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程无权访问或修改系统属性。 |
checkPropertyAccess
public void checkPropertyAccess(String key)
如果不允许调用线程访问具有指定键名的系统属性,则抛出 SecurityException。
此方法由 System 类的 getProperty 方法使用。
此方法使用 PropertyPermission(key, "read") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkPropertyAccess。
参数:
参数名称 | 参数描述 |
---|---|
key | 系统属性键。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定系统属性的权限。 |
NullPointerException | 如果关键参数为空。 |
IllegalArgumentException | 如果键为空。 |
checkTopLevelWindow
@Deprecated public boolean checkTopLevelWindow(Object window)
已弃用。对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。此方法的用户应改为直接调用 checkPermission(java.security.Permission)。此方法将在未来版本中更改以检查权限 java.security.AllPermission。
如果不信任调用线程调出由 window 参数指示的顶级窗口,则返回 false。在这种情况下,调用者仍然可以决定显示窗口,但窗口应该包含某种视觉警告。如果该方法返回 true,则可以在没有任何特殊限制的情况下显示窗口。
该方法以 AWTPermission("showWindowWithoutWarningBanner") 权限调用 checkPermission,如果没有抛出 SecurityException,则返回 true,否则返回 false。在不包含 java.awt 包的 Java SE 子集配置文件的情况下,将调用 checkPermission 来检查权限 java.security.AllPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会返回 false 的地方调用 super.checkTopLevelWindow,并且应该返回 super.checkTopLevelWindow 的值。
参数:
参数名称 | 参数描述 |
---|---|
window | 正在创建的新窗口。 |
返回:
如果信任调用线程来建立顶级窗口,则为 true; 否则为 false。
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果窗口参数为空。 |
checkPrintJobAccess
public void checkPrintJobAccess()
如果不允许调用线程发起打印作业请求,则抛出 SecurityException。
此方法使用 RuntimePermission("queuePrintJob") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkPrintJobAccess。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程无权发起打印作业请求。 |
checkSystemClipboardAccess
@Deprecated public void checkSystemClipboardAccess()
已弃用。 对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。 此方法的用户应改为直接调用 checkPermission(java.security.Permission)。 此方法将在未来版本中更改以检查权限 java.security.AllPermission。
如果不允许调用线程访问系统剪贴板,则引发 SecurityException。
此方法使用 AWTPermission("accessClipboard") 权限调用 checkPermission。 在不包含 java.awt 包的 Java SE 子集配置文件的情况下,将调用 checkPermission 来检查权限 java.security.AllPermission。
如果你重写了这个方法,那么你应该调用 super.checkSystemClipboardAccess 在被重写的方法通常会抛出异常的地方。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问系统剪贴板的权限。 |
checkAwtEventQueueAccess
@Deprecated public void checkAwtEventQueueAccess()
已弃用。 对 AWTPermission 的依赖对 Java 平台的未来模块化造成了障碍。 此方法的用户应改为直接调用 checkPermission(java.security.Permission)。 此方法将在未来版本中更改以检查权限 java.security.AllPermission。
如果不允许调用线程访问 AWT 事件队列,则引发 SecurityException。
此方法使用 AWTPermission("accessEventQueue") 权限调用 checkPermission。 在不包含 java.awt 包的 Java SE 子集配置文件的情况下,将调用 checkPermission 来检查权限 java.security.AllPermission。
如果您覆盖此方法,那么您应该调用 super.checkAwtEventQueueAccess,此时被覆盖的方法通常会引发异常。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问 AWT 事件队列的权限。 |
checkPackageAccess
public void checkPackageAccess(String pkg)
如果不允许调用线程访问参数指定的包,则抛出 SecurityException。
该方法由类加载器的 loadClass 方法使用。
此方法首先通过从对 java.security.Security.getProperty("package.access") 的调用中获取逗号分隔的列表来获取受限包的列表,并检查 pkg 是否以或等于任何受限包开头 . 如果是,则使用 RuntimePermission("accessClassInPackage."+pkg) 权限调用 checkPermission。
如果此方法被覆盖,则 super.checkPackageAccess 应作为被覆盖方法的第一行调用。
参数:
参数名称 | 参数描述 |
---|---|
pkg | 包名。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有访问指定包的权限。 |
NullPointerException | 如果包名称参数为空。 |
checkPackageDefinition
public void checkPackageDefinition(String pkg)
如果不允许调用线程在参数指定的包中定义类,则抛出 SecurityException。
该方法被某些类加载器的 loadClass 方法使用。
此方法首先通过从对 java.security.Security.getProperty("package.definition") 的调用中获取逗号分隔的列表来获取受限包的列表,并检查 pkg 是否以任何受限包开头或等于任何受限包 . 如果是这样,则使用 RuntimePermission("defineClassInPackage."+pkg) 权限调用 checkPermission。
如果此方法被覆盖,则 super.checkPackageDefinition 应作为被覆盖方法的第一行调用。
参数:
参数名称 | 参数描述 |
---|---|
pkg | 包名。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有权限在指定包中定义类。 |
checkSetFactory
public void checkSetFactory()
如果不允许调用线程设置 ServerSocket 或 Socket 使用的套接字工厂或 URL 使用的流处理程序工厂,则抛出 SecurityException。
此方法使用 RuntimePermission("setFactory") 权限调用 checkPermission。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkSetFactory。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程无权指定套接字工厂或流处理程序工厂。 |
checkMemberAccess
@Deprecated public void checkMemberAccess(Class<?> clazz, int which)
已弃用。 此方法依赖于调用者处于 4 的堆栈深度,这很容易出错并且不能由运行时强制执行。 此方法的用户应改为直接调用 checkPermission(java.security.Permission)。 此方法将在未来版本中更改以检查权限 java.security.AllPermission。
如果不允许调用线程访问成员,则抛出 SecurityException。
默认策略是允许访问 PUBLIC 成员,以及访问与调用者具有相同类加载器的类。 在所有其他情况下,此方法使用 RuntimePermission("accessDeclaredMembers") 权限调用 checkPermission。
如果此方法被覆盖,则无法调用 super.checkMemberAccess,因为 checkMemberAccess 的默认实现依赖于被检查的代码的堆栈深度为 4。
参数:
参数名称 | 参数描述 |
---|---|
clazz | 要在其上执行反射的类。 |
which | 访问类型,公共或声明。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用者没有访问成员的权限。 |
NullPointerException | 如果 clazz 参数为空。 |
checkSecurityAccess
public void checkSecurityAccess(String target)
确定是否应授予或拒绝具有指定权限目标名称的权限。
如果请求的权限被允许,则此方法安静地返回。 如果被拒绝,则会引发 SecurityException。
此方法为给定的权限目标名称创建一个 SecurityPermission 对象,并使用它调用 checkPermission。
有关可能的权限目标名称的列表,请参阅 SecurityPermission 的文档。
如果你重写了这个方法,那么你应该在被重写的方法通常会抛出异常的时候调用 super.checkSecurityAccess。
参数:
参数名称 | 参数描述 |
---|---|
target | SecurityPermission 的目标名称。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果调用线程没有请求访问的权限。 |
NullPointerException | 如果目标为null |
IllegalArgumentException | 如果目标为empty |
getThreadGroup
public ThreadGroup getThreadGroup()
返回线程组,在该线程组中实例化在调用它时创建的任何新线程。 默认情况下,它返回当前线程的线程组。 这应该由特定的安全管理器覆盖以返回适当的线程组。
返回:
将新线程实例化到的 ThreadGroup
更多建议: