已知直接子类:
public classSecurityManager extendsObject
安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行可能不安全或敏感的操作之前确定操作是什么以及是否在允许执行操作的安全上下文中尝试操作。应用程序可以允许或禁止操作。
SecurityManager类包含许多名称以check开头的方法。在这些方法执行某些可能敏感的操作之前,这些方法在Java库中通过各种方法调用。这种check方法的调用通常如下所示:
SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkXXX(argument, . . . ); }
因此,安全管理器有机会通过抛出异常来阻止操作的完成。如果允许操作,则安全管理器例程仅返回,但如果不允许操作,则抛出SecurityException。
当前安全管理器由类System的setSecurityManager方法设置。当前的安全管理器是通过getSecurityManager方法获得的。
特殊方法checkPermission(java.security.Permission)确定是否应该授予或拒绝由指定许可指示的访问请求。默认实现调用
AccessController.checkPermission(perm);
如果允许访问请求,checkPermission将安静地返回。如果被拒绝,则抛出SecurityException。
每个其他的默认实现check的方法SecurityManager是调用SecurityManager checkPermission方法来确定调用线程具有执行所请求的操作的权限。
请注意,仅具有单个权限参数的checkPermission方法始终在当前正在执行的线程的上下文中执行安全检查。有时,应该在给定上下文中进行的安全检查实际上需要在不同的上下文中完成(例如,在工作线程内)。为这种情况提供了getSecurityContext方法和包含上下文参数的checkPermission方法。getSecurityContext方法返回当前调用上下文的“快照”。(默认实现返回AccessControlContext对象。)示例调用如下:
Object context = null; SecurityManager sm = System.getSecurityManager(); if (sm != null) context = sm.getSecurityContext();
除了权限之外还采用上下文对象的checkPermission方法基于该上下文而不是当前执行线程的方式做出访问决策。因此,不同上下文中的代码可以调用该方法,传递权限和先前保存的上下文对象。使用如上例sm获得的SecurityManagersm进行的示例调用如下:
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”等)。星号可以出现在名称的末尾,跟在“。”之后,或者单独出现,以表示通配符匹配。例如:“a。*”或“*”有效,“* a”或“a * b”无效。
FilePermission和SocketPermission是权限的顶级类的子类(java.security.Permission)。像这样的类具有比BasicPermission子类直接从Permission而不是BasicPermission使用的更复杂的名称语法。例如,对于java.io.FilePermission对象,权限名称是文件(或目录)的路径名。
某些权限类具有“操作”列表,该列表指示对象允许的操作。例如,对于java.io.FilePermission对象,操作列表(例如“读取,写入”)指定为指定文件(或指定目录中的文件)授予的操作。
其他权限类用于“命名”权限 - 包含名称但没有操作列表的权限;您要么拥有命名权限,要么不拥有。
注意:还有一个隐含所有权限的java.security.AllPermission权限。它的存在是为了简化可能需要执行需要所有(或众多)权限的多个任务的系统管理员的工作。
有关许可相关信息,请参见Permissions in the Java Development Kit (JDK) 。本文档包含一个表,列出了各种SecurityManagercheck方法以及每种此类方法的默认实现所需的权限。它还包含一个需要权限的方法表,并且每个这样的方法都会告诉它需要哪个权限。

构造一个新的SecurityManager。

方法摘要

变量和类型方法描述
如果不允许调用线程接受来自指定主机和端口号的套接字连接,则抛出SecurityException。
如果不允许调用线程修改线程参数,则抛出SecurityException。
如果不允许调用线程修改线程组参数,则抛出SecurityException。
如果不允许调用线程打开到指定主机和端口号的套接字连接,则抛出SecurityException。
如果不允许调用线程创建新的类加载器,则抛出SecurityException。
如果不允许调用线程删除指定文件,则抛出SecurityException。
如果不允许调用线程创建子进程,则抛出SecurityException。
如果不允许调用线程导致Java虚拟机使用指定的状态代码暂停,则抛出SecurityException。
如果不允许调用线程动态链接字符串参数文件指定的库代码,则抛出SecurityException。
如果不允许调用线程等待指定本地端口号上的连接请求,则抛出SecurityException。
如果不允许调用线程使用(加入/离开/发送/接收)IP多播,则抛出SecurityException。
已过时。
请改用#checkPermission(java.security.Permission)
如果不允许调用线程访问指定的包,则抛出SecurityException。
如果不允许调用线程在指定的包中定义类,则抛出SecurityException。
如果根据当前有效的安全策略不允许由给定权限指定的请求访问,则抛出SecurityException。
如果不允许调用线程启动打印作业请求,则抛出SecurityException。
如果不允许调用线程访问或修改系统属性,则抛出SecurityException。
抛出SecurityException如果调用线程不允许使用指定的访问系统属性key名。
如果不允许调用线程从指定的文件描述符读取,则抛出SecurityException。
如果不允许调用线程读取字符串参数指定的文件,则抛出SecurityException。
确定是应授予还是拒绝具有指定权限目标名称的权限。
抛出SecurityException如果调用线程不允许设置由使用的套接字工厂ServerSocket或Socket,或使用的流处理程序工厂URL。
如果不允许调用线程写入指定的SecurityException则抛出SecurityException。
如果不允许调用线程写入字符串参数指定的文件,则抛出SecurityException。
将当前执行堆栈作为类数组返回。
创建一个封装当前执行环境的对象。
返回一个线程组,在该线程组中实例化在调用它时创建的任何新线程。

构造方法详细信息

SecurityManager
public SecurityManager()
构造一个新的SecurityManager。
如果已安装安全管理器,则此方法首先使用RuntimePermission("createSecurityManager")权限调用安全管理器的checkPermission方法,以确保调用线程具有创建新安全管理器的权限。这可能会导致投掷SecurityException。
异常
SecurityException- 如果安全管理器已存在且其checkPermission方法不允许创建新的安全管理器。
另请参见:

方法详细信息

getClassContext
protected类[] getClassContext()
将当前执行堆栈作为类数组返回。
数组的长度是执行堆栈上的方法数。索引0处的元素是当前正在执行的方法的类,索引1处的元素是该方法的调用者的类,依此类推。
结果
执行堆栈。
getSecurityContext
创建一个封装当前执行环境的对象。这种方法的结果被使用,例如,由三个参数checkConnect方法和由两个参数checkRead方法。需要这些方法是因为可以调用受信任的方法来代表另一个方法读取文件或打开套接字。受信任的方法需要确定是否允许其他(可能是不受信任的)方法自己执行操作。
此方法的默认实现是返回AccessControlContext对象。
结果
依赖于实现的对象,它封装有关当前执行环境的足够信息,以便稍后执行某些安全检查。
另请参见:
如果根据当前有效的安全策略不允许由给定权限指定的请求访问,则抛出SecurityException。
此方法使用给定的权限调用AccessController.checkPermission。
如果拒绝指定的安全上下文访问由给定权限指定的资源,则抛出SecurityException。上下文必须是先前对getSecurityContext调用返回的安全上下文,并且访问控制决策基于为该安全上下文配置的安全策略。
如果context是实例AccessControlContext则AccessControlContext.checkPermission方法被调用与指定的权限。
如果context不是一个实例AccessControlContext然后SecurityException异常。
checkCreateClassLoader
public void checkCreateClassLoader()
如果不允许调用线程创建新的类加载器,则抛出SecurityException。
此方法使用RuntimePermission("createClassLoader")权限调用checkPermission。
如果重写此方法,则应该在重写方法通常会抛出异常时调用super.checkCreateClassLoader。
如果不允许调用线程修改线程参数,则抛出SecurityException。
此方法被调用为当前的安全管理stop,suspend,resume,setPriority,setName,并setDaemon类的方法Thread。
如果thread参数是系统线程(属于具有null父级的线程组),则此方法使用RuntimePermission("modifyThread")权限调用checkPermission。如果thread参数不是系统线程,则此方法只是静默返回。
需要更严格策略的应用程序应覆盖此方法。如果重写此方法,则覆盖它的方法应另外检查调用线程是否具有RuntimePermission("modifyThread")权限,如果是,RuntimePermission("modifyThread")静默方式返回。这是为了确保允许授予该权限的代码(例如JDK本身)来操纵任何线程。
如果重写此方法,则应该通过重写方法中的第一个语句调用super.checkAccess,或者应该在重写方法中放置等效安全检查。
如果不允许调用线程修改线程组参数,则抛出SecurityException。
这种方法被调用为当前的安全管理器创建一个新的子线程或子线程组时,以及由setDaemon,setMaxPriority,stop,suspend,resume,并destroy类的方法ThreadGroup。
如果线程组参数是系统线程组(具有null父级),则此方法将使用RuntimePermission("modifyThreadGroup")权限调用checkPermission。如果线程组参数不是系统线程组,则此方法只是静默返回。
需要更严格策略的应用程序应覆盖此方法。如果重写此方法,则覆盖它的方法应另外检查调用线程是否具有RuntimePermission("modifyThreadGroup")权限,如果是,RuntimePermission("modifyThreadGroup")静默方式返回。这是为了确保允许授予该权限的代码(例如JDK本身)来操纵任何线程。
如果重写此方法,则应在重写方法中的第一个语句调用super.checkAccess,或者应在重写方法中放置等效安全性检查。
checkExit
public void checkExit(int status)
如果不允许调用线程导致Java虚拟机使用指定的状态代码暂停,则抛出SecurityException。
通过类Runtime的exit方法为当前安全性管理器调用此方法。状态为0表示成功;其他值表示各种错误。
此方法使用RuntimePermission("exitVM."+status)权限调用checkPermission。
如果重写此方法,则应该在重写方法通常会抛出异常时调用super.checkExit。
如果不允许调用线程创建子进程,则抛出SecurityException。
通过类Runtime的exec方法为当前安全管理器调用此方法。
此方法调用checkPermission与FilePermission(cmd,"execute")如果cmd是绝对路径的权限,否则它会调用checkPermission与FilePermission("