所有类


java.lang
类 SecurityManager

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 权限。该权限是为了简化系统管理员的工作而存在的,因为管理员可能需要执行很多需要所有(或许多)权限的任务。

有关权限相关的信息,请参阅《Permissions in the JDK》。例如,本文档包括一个列出各种 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

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部