|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
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.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
权限。该权限是为了简化系统管理员的工作而存在的,因为管理员可能需要执行很多需要所有(或许多)权限的任务。
有关权限相关的信息,请参阅《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() 如果不允许调用线程设置由 ServerSocket 或 Socket 使用的套接字工厂,或者由 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
:- 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
- 在执行堆栈中,直到第一个“特权”调用方(参见
AccessController.doPrivileged(java.security.PrivilegedAction
)为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。) - 使用
java.security.AllPermission
调用checkPermission
不会导致 SecurityException。
-
- 返回:
- 最近执行的、使用非系统类加载器定义的类方法堆栈中的类加载器。
- 另请参见:
-
getSystemClassLoader
,checkPermission
currentLoadedClass
@Deprecated protected Class<?> currentLoadedClass()
-
已过时。 建议不使用该类安全检查。建议使用
checkPermission
调用。 -
返回最近执行的、使用非系统类加载器定义的类方法的类。非系统类加载器被定义为一种不同于系统类加载器(由
ClassLoader.getSystemClassLoader()
返回)或其祖先之一的类加载器。在以下三种情况中,此方法将返回
null
:- 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
- 在执行堆栈中,直到第一个“特权”调用方(参见
AccessController.doPrivileged(java.security.PrivilegedAction
)为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。) - 使用
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:
- 执行堆栈中的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。
- 在执行堆栈中,直到第一个“特权”调用方(参见
AccessController.doPrivileged(java.security.PrivilegedAction
)为止的所有方法都来自于使用系统类加载器或其祖先之一所定义的类。) - 使用
java.security.AllPermission
调用checkPermission
不会导致 SecurityException。
-
- 返回:
- 最近出现的、使用非系统类加载器定义的类方法的堆栈帧深度。
- 另请参见:
-
getSystemClassLoader
,checkPermission
inClass
@Deprecated protected boolean inClass(String name)
-
已过时。 建议不使用该类安全检查。建议使用
checkPermission
调用。 - 测试具有指定名称的类方法是否处于执行堆栈中。
-
- 参数:
-
name
- 该类的完全限定名。 - 返回:
-
如果具有指定名称的类方法处于执行堆栈中,则返回
true
;否则返回false
。