java.lang

接口
异常
错误
注释
java.lang.Object
  继承者 java.lang.SecurityManager
直接已知子类:
RMISecurityManager

public class SecurityManager
     
extends Object

安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行一个可能不安全或敏感的操作前确定该操作是什么,以及是否是在允许执行该操作的安全上下文中执行它。应用程序可以允许或不允许该操作。

SecurityManager 类包含了很多名称以单词 check 开头的方法。Java 库中的各种方法在执行某些潜在的敏感操作前可以调用这些方法。对 check 方法的典型调用如下:

     SecurityManager security = System.getSecurityManager();
     if (security != null) {
         security.checkXXX(argument,  . . . );
     }
 

因此,安全管理器通过抛出异常来提供阻止操作完成的机会。如果允许执行该操作,则安全管理器例程只是简单地返回,但如果不允许执行该操作,则抛出一个 SecurityException。该约定的唯一例外是 checkTopLevelWindow,它返回 boolean 值。

当前的安全管理器由 System 类中的 setSecurityManager 方法设置。当前的安全管理器由 getSecurityManager 方法获得。

特殊方法 checkPermission(java.security.Permission) 确定是应该允许还是拒绝由指定权限所指示的访问请求。默认的实现调用

   AccessController.checkPermission(perm);
 

如果允许访问请求,则安静地返回 checkPermission。如果拒绝访问请求,则抛出 SecurityException

从 Java 2 SDK v1.2 开始,SecurityManager 中其他所有 check 方法的默认实现都是调用 SecurityManager checkPermission 方法来确定调用线程是否具有执行所请求操作的权限。

注意,只带有单个权限参数的 checkPermission 方法总是在当前执行的线程上下文中执行安全检查。有时,应该在给定上下文中进行的安全检查实际上需要在不同 的上下文(例如,在一个辅助线程中)中进行。Java 为这种情况提供了包含有上下文参数的 getSecurityContext 方法和 checkPermission 方法。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.FilePermissionjava.net.SocketPermissionjava.net.NetPermissionjava.security.SecurityPermissionjava.lang.RuntimePermissionjava.util.PropertyPermissionjava.awt.AWTPermissionjava.lang.reflect.ReflectPermissionjava.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 权限。该权限是为了简化系统管理员的工作而存在的,因为管理员可能需要执行很多需要所有(或许多)权限的任务。

有关权限相关的信息,请参阅 。例如,本文档包括一个列出各种 SecurityManager 的 check 方法和每个方法的默认实现所需的权限表。它还包含了版本 1.2 方法所需权限和每个方法需要哪些权限的表。

有关 JDK 中对 SecurityManager 所作更改的更多信息和关于 1.1 风格安全管理器移植的建议,请参阅 security documentation

从以下版本开始:
JDK1.0
另请参见:
ClassLoader, SecurityException, checkTopLevelWindow, getSecurityManager, setSecurityManager, AccessController, AccessControlContext, AccessControlException, Permission, BasicPermission, FilePermission, SocketPermission, PropertyPermission, RuntimePermission, AWTPermission, Policy, SecurityPermission, ProtectionDomain

字段摘要
protected  boolean inCheck
          已过时。 建议不使用该类型的安全检查。建议使用 checkPermission 调用。
 
构造方法摘要
SecurityManager()
          构造一个新的 SecurityManager
 
方法摘要
 void checkAccept(String host, int port)
          如果不允许调用线程从指定的主机和端口号接受套接字连接,则抛出 SecurityException
 void checkAccess(Thread t)
          如果不允许调用线程修改 thread 参数,则抛出 SecurityException
 void checkAccess(ThreadGroup g)
          如果不允许调用线程修改线程组参数,则抛出 SecurityException
 void checkAwtEventQueueAccess()
          如果不允许调用线程访问 AWT 事件队列,则抛出 SecurityException
 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)
          如果不允许调用线程访问程序,则抛出 SecurityException
 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)
          如果不允许调用线程访问具有指定的 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()
          如果不允许调用线程设置由 ServerSocketSocket 使用的套接字工厂,或者由 URL 使用的流处理程序工厂,则抛出 SecurityException
 void checkSystemClipboardAccess()
          如果不允许调用线程访问系统剪贴板,则抛出 SecurityException
 boolean checkTopLevelWindow(Object window)
          如果不受信任的调用线程调出由 window 参数指出的顶层窗口,则返回 false
 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

如果已经安装了一个安全管理器,则此方法首先用 RuntimePermission("createSecurityManager") 权限调用此安全管理器的 checkPermission 方法,确保调用线程具有创建新安全管理器的权限。这可能导致抛出 SecurityException

抛出:
SecurityException - 如果安全管理器已存在,并且其 checkPermission 方法不允许创建新安全管理器。
另请参见:
System.getSecurityManager(), checkPermission, RuntimePermission
方法详细信息

getInCheck

@Deprecated
public boolean getInCheck()
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

测试安全检查是否正在进行。

返回:
inCheck 字段的值。如果安全检查正在进行,则该字段应该为 true,否则应该为 false
另请参见:
inCheck

getClassContext

protected Class[] getClassContext()
以类数组的形式返回当前执行堆栈。

数组的长度是执行堆栈中的方法数。索引 0 指定的元素是当前执行方法的类,索引 1 指定的元素是该方法调用方的类,依此类推。

返回:
执行堆栈。

currentClassLoader

@Deprecated
protected ClassLoader currentClassLoader()
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

返回最近执行的、使用非系统类加载器定义的类方法的类加载器。非系统类加载器被定义为一种不同于系统类加载器(由 ClassLoader.getSystemClassLoader() 返回)或其祖先之一的类加载器。

在以下三种情况中,此方法将返回 null

  1. 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  2. 在执行堆栈中,直到第一个“特权”调用方(参见 AccessController.doPrivileged(java.security.PrivilegedAction ) )为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  3. 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。

返回:
最近执行的、使用非系统类加载器定义的类方法堆栈中的类加载器。
另请参见:
getSystemClassLoader, checkPermission

currentLoadedClass

@Deprecated
protected Class<?> currentLoadedClass()
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

返回最近执行的、使用非系统类加载器定义的类方法的类。非系统类加载器被定义为一种不同于系统类加载器(由 ClassLoader.getSystemClassLoader() 返回)或其祖先之一的类加载器。

在以下三种情况中,此方法将返回 null

  1. 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  2. 在执行堆栈中,直到第一个“特权”调用方(参见 AccessController.doPrivileged(java.security.PrivilegedAction ) )为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  3. 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。

返回:
最近出现的、使用非系统类加载器定义的类方法堆栈中的类。
另请参见:
getSystemClassLoader, checkPermission

classDepth

@Deprecated
protected int classDepth(String name)
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

返回指定类的堆栈深度。

参数:
name - 要查找的类的完全限定名。
返回:
在指定名称的类中第一个方法出现的堆栈帧深度;如未找到这样的帧,则返回 -1

classLoaderDepth

@Deprecated
protected int classLoaderDepth()
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

返回最近执行的、使用非系统类加载器定义的类方法的堆栈深度。非系统类加载器被定义为一种不同于系统类加载器(由 ClassLoader.getSystemClassLoader() 返回)或其祖先之一的类加载器。

在以下三种情况中,此方法将返回 -1:

  1. 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  2. 在执行堆栈中,直到第一个“特权”调用方(参见 AccessController.doPrivileged(java.security.PrivilegedAction ) )为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
  3. 使用 java.security.AllPermission 调用 checkPermission 不会导致 SecurityException。

返回:
最近出现的、使用非系统类加载器定义的类方法的堆栈帧深度。
另请参见:
getSystemClassLoader, checkPermission

inClass

@Deprecated
protected boolean inClass(String name)
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

测试具有指定名称的类方法是否处于执行堆栈中。

参数:
name - 该类的完全限定名。
返回:
如果具有指定名称的类方法处于执行堆栈中,则返回 true;否则返回 false

inClassLoader

@Deprecated
protected boolean inClassLoader()
已过时。  建议不使用该类安全检查。建议使用 checkPermission 调用。

主要是测试某个使用类加载器定义的类方法是否处于执行堆栈中。

返回:
如果调用 currentClassLoader 具有非 null 的返回值,则返回 true
另请参见:
currentClassLoader

getSecurityContext

public Object getSecurityContext()
创建一个封装当前执行环境的对象。例如,此方法的结果由带有三参数的 checkConnect 方法和带有两参数的 checkRead 方法使用。这些方法是必需的,因为一个受信任的方法可能代表另一方法被调用,以读取一个文件或打开一个套接字。受信任的方法需要确定是否允许另一个方法(可能不受信任)独自执行该操作。

此方法的默认实现是返回 AccessControlContext 对象。

返回:
一个取决于实现的对象,该对象封装了有关当前执行环境的足够信息,这些信息用于稍后执行某些安全检查。
另请参见:
checkConnect, checkRead, AccessControlContext

checkPermission

public void checkPermission(Permission perm)
如果基于当前有效的安全策略,不允许执行根据给定权限所指定的请求访问,则抛出 SecurityException

此方法使用给定的权限调用 AccessController.checkPermission

参数:
perm - 请求的权限。
抛出:
SecurityException - 如果根据当前的安全策略不允许进行访问。
NullPointerException - 如果 permission 参数为 null
从以下版本开始:
1.2

checkPermission

public void checkPermission(Permission perm,
                            Object context)
如果拒绝指定的安全上下文访问由给定权限所指定的资源,则抛出 SecurityException。该上下文必须是一个通过以前调用 getSecurityContext 所返回的安全上下文,并且应该根据为该安全上下文所配置的安全策略来作出访问控制决策。

如果 contextAccessControlContext 的一个实例,则用指定的权限调用 AccessControlContext.checkPermission 方法。

如果 context 不是 AccessControlContext 的一个实例,则抛出 SecurityException

参数:
perm - 指定的权限。
context - 一个取决于系统的安全上下文。
抛出:
SecurityException - 如果指定的安全上下文不是 AccessControlContext 的一个实例(如为 null),或者访问由给定权限所指定的资源时被拒绝。
NullPointerException - 如果权限参数为 null
从以下版本开始:
1.2
另请参见:
getSecurityContext(), AccessControlContext.checkPermission(java.security.Permission)

checkCreateClassLoader

public void checkCreateClassLoader()
如果不允许调用线程创建新的类加载器,则抛出 SecurityException

此方法用 RuntimePermission("createClassLoader") 权限调用 checkPermission

如果重写此方法,那么应该在已重写方法通常将要抛出异常时调用 super.checkCreateClassLoader

抛出:
SecurityException - 如果调用线程没有创建新类加载器的权限。
另请参见:
ClassLoader.ClassLoader(), checkPermission

checkAccess

public void checkAccess(Thread t)
如果不允许调用线程修改 thread 参数,则抛出 SecurityException

Thread 类的 stopsuspendresumesetPrioritysetNamesetDaemon 方法为当前的安全管理器调用此方法。

如果 thread 参数是一个系统线程(属于具有一个 null 父线程的线程组),那么此方法使用 RuntimePermission("modifyThread") 权限调用 checkPermission。如果 thread 参数 是一个系统线程,则此方法不执行任何操作。

希望具有更为严格策略的应用程序应该重写此方法。如果重写此方法,那么重写它的方法应该进行额外的检查,查看调用线程是否具有 RuntimePermission("modifyThread") 权限,如果是,则此方法不执行任何操作。这样做是为了确保允许那些被授予该权限的代码(如 JDK 本身)能够操作所有线程。

如果重写此方法,那么应该由已重写方法中的第一条语句调用 super.checkAccess,或者应该在已重写方法中放入等效的安全检查代码。

参数:
t - 要检查的线程。
抛出:
SecurityException - 如果调用线程没有修改线程的权限。
NullPointerException - 如果线程参数为 null
另请参见:
resume, setDaemon, setName, setPriority, stop, suspend, checkPermission

checkAccess

public void checkAccess(ThreadGroup g)
如果不允许调用线程修改线程组参数,则抛出 SecurityException

当创建新的子线程或子线程组时,由 ThreadGroup 类的 setDaemonsetMaxPrioritystopsuspendresumedestroy 方法为当前的安全管理器调用此方法。

如果该线程组是一个系统线程组(具有 null 父线程),那么此方法使用 RuntimePermission("modifyThreadGroup") 权限调用 checkPermission。如果该线程组 是一个系统线程组,则此方法不执行任何操作。

希望具有更为严格策略的应用程序应该重写此方法。如果重写此方法,那么重写它的方法应该进行额外的检查,查看调用线程是否具有 RuntimePermission("modifyThreadGroup") 权限,如果是,则此方法不执行任何操作。这样做是为了确保允许那些被授予该权限的代码(如 JDK 本身)能够操作所有线程。

如果重写此方法,那么应该由已重写方法中的第一条语句调用 super.checkAccess,或者应该在已重写方法中放入等效的安全检查。

参数:
g - 要检查的线程组。
抛出:
SecurityException - 如果调用线程没有修改线程组的权限。
NullPointerException - 如果线程组参数为 null
另请参见:
destroy, resume, setDaemon, setMaxPriority, stop, suspend, checkPermission

checkExit

public void checkExit(int status)
如果不允许调用线程使用特定的状态码暂停 Java 虚拟机,则抛出 SecurityException

Runtime 类的 exit 方法为当前的安全管理器调用此方法。状态 0 表示成功,其他值则表示各种错误。

此方法用 RuntimePermission("exitVM."+status) 权限调用 checkPermission

如果重写此方法,那么通常应该在已重写方法将要抛出异常时调用 super.checkExit

参数:
status - 退出状态。
抛出:
SecurityException - 如果调用线程没有用指定的状态暂停 Java 虚拟机的权限。
另请参见:
exit, checkPermission

checkExec

public void checkExec(String cmd)
如果不允许调用线程创建一个子进程,则抛出 SecurityException

Runtime 类的 exec 方法为当前的安全管理器调用此方法。

如果 cmd 是绝对路径,那么此方法使用 FilePermission(cmd,"execute") 权限调用 checkPermission,否则用 FilePermission("<<ALL FILES>>","execute") 权限调用 checkPermission

如果重写此方法,那么通常应该在已重写方法将要抛出异常时调用 super.checkExec

参数:
cmd - 指定的系统命令。
抛出:
SecurityException - 如果调用线程没有创建子进程的权限。
NullPointerException - 如果 cmd 参数为 null
另请参见:
Runtime.exec(java.lang.String), Runtime.exec(java.lang.String, java.lang.String[]), Runtime.exec(java.lang.String[]), Runtime.exec(java.lang.String[], java.lang.String[]), checkPermission

checkLink

public void checkLink(String lib)
如果不允许调用线程动态链接由字符串参数文件指定的库代码,则抛出 SecurityException。此方法中的参数可以是一个简单的库名,或者是一个完整的文件名。

Runtime 类的 loadloadLibrary 方法为当前的安全管理器调用此方法。

此方法用 RuntimePermission("loadLibrary."+lib) 权限调用 checkPermission

如果重写此方法,那么通常应该在已重写方法将要抛出异常时调用 super.checkLink

参数:
lib - 库名。