java.lang.SecurityManager 源码

SecurityManager sm = System.getSecurityManager();

安全管理器是允许应用程序实施安全策略的类。 它允许应用程序在执行可能不安全或敏感的操作之前确定操 作是什么以及是否在允许执行操作的安全上下文中尝试。 应用程序可以允许或禁止操作。
SecurityManager类包含许多方法,名称以check 。 在这些方法执行某些潜在的敏感操作之前,这些方法在Java库中被各种方法所调用。 调用这样的check方法通常如下所示:

 SecurityManager security = System.getSecurityManager();
 if (security != null) {
     security.checkXXX(argument,  . . . );
 }
  • 因此,安全管理员有机会通过抛出异常来防止操作完成。 安全管理器例程只是简单地返回如果允许在运行,但抛出一个SecurityException如果操作是不允许的。 这个惯例的唯一例外是checkTopLevelWindow ,它返回一个boolean值。

  • 当前的安全管理器由setSecurityManager方法在System类中System 。 当前的安全管理器是通过getSecurityManager方法获得的。

  • 特殊方法checkPermission(java.security.Permission)确定是否应该授予或拒绝由指定许可表示的访问请求。 默认实现调用

  • AccessController.checkPermission(perm); 如果允许访问请求, checkPermission安静地返回。 如果被拒绝,则会抛出一个SecurityException 。

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

  • 请注意,只有一个权限参数的checkPermission方法总是在当前执行的线程的上下文中执行安全检查。 有时,在特定上下文中应该进行的安全检查实际上需要在不同的上下文(例如,从工作线程中)完成。 提供了包含上下文参数的getSecurityContext方法和checkPermission方法。 getSecurityContext方法返回当前调用上下文的“快照”。 (默认实现返回一个AccessControlContext对象。)示例调用如下:

  Object context = null;
   SecurityManager sm = System.getSecurityManager();
   if (sm != null) context = sm.getSecurityContext(); 
  • 除了checkPermission ,接受上下文对象的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所有权限的java.security.AllPermission权限。 它存在以简化可能需要执行需要所有(或多个)权限的多个任务的系统管理员的工作。

  • 有关权限相关信息,请参阅Permissions in the JDK。 本文档包括例如列出各种SecurityManager check方法的表以及每种此类方法的默认实现所需的权限。 它还包含需要权限的所有版本1.2方法的表,并且对于每个这样的方法来说明它需要哪个权限。

返回类型 方法名 方法描述
void checkAccept(String host, int port) 如果调用线程不允许从指定的主机和端口号接受套接字连接,则抛出一个 SecurityException 。
void checkAccess(Thread t) 如果调用线程不允许修改线程参数,则抛出一个 SecurityException 。
void checkAccess(ThreadGroup g) 如果调用线程不允许修改线程组参数,则抛出一个 SecurityException 。
void checkAwtEventQueueAccess() 已弃用 对AWTPermission的依赖性对未来Java平台的AWTPermission造成了障碍。 该方法的用户应直接调用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(类 clazz, int which) 已弃用 该方法依赖于调用者的堆栈深度为4,容易出错,并且不能由运行时执行。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改,以检查权限java.security.AllPermission 。
void checkMulticast(InetAddress maddr) 抛出 SecurityException如果调用线程不允许使用(加入/离开/发送/接收)IP多播。
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() 抛出 SecurityException如果调用线程不允许设置由使用的套接字工厂 ServerSocket或 Socket ,或使用的流处理程序工厂 URL 。
void checkSystemClipboardAccess() 已弃用 对AWTPermission的依赖性为Java平台未来的AWTPermission创造了障碍。 该方法的用户应直接调用checkPermission(java.security.Permission) 。 此方法将在以后的版本中更改,以检查权限java.security.AllPermission 。
boolean checkTopLevelWindow(Object window) 已弃用 对AWTPermission的依赖性为Java平台的未来AWTPermission创造了障碍。 该方法的用户应直接调用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 类 currentLoadedClass() 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission通话。
protected 类[] getClassContext() 将当前执行堆栈作为一个类的数组返回。
boolean getInCheck() 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission调用。
Object getSecurityContext() 创建封装当前执行环境的对象。
ThreadGroup getThreadGroup() 返回要在其被调用时实例化任何正在创建的新线程的线程组。
protected boolean inClass(String name) 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission呼叫。
protected boolean inClassLoader() 已弃用 不推荐使用这种类型的安全检查。 建议使用checkPermission通话。

猜你喜欢

转载自blog.csdn.net/baidu_36327010/article/details/80665067