热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaSecurityManager解析与使用详解

JavaSecurityManager类解析SecurityManager,顾名思义,安全管理,通俗地讲,该类用于对jav

Java SecurityManager类解析

SecurityManager,顾名思义,安全管理,通俗地讲,该类用于对java程序的某些行为进行安全检查,判断该行为是否合法,是否要继续执行。

首先,我们来看看SecurityManager的构造方法:

public SecurityManager() {synchronized(SecurityManager.class) {SecurityManager sm = System.getSecurityManager();if (sm != null) {// ask the currently installed security manager if we// can create a new one.sm.checkPermission(new RuntimePermission("createSecurityManager"));}initialized = true;}}

我们在创建一个SecurityManager对象时,构造方法里会调用System类里的getSecurityManager()方法,System类下的getSecurityManager()与返回值security 成员变量如下:

private static volatile SecurityManager security = null;
public static SecurityManager getSecurityManager() {return security;}

在没有对security赋值前,security为null,getSecurityManager()返回的也是null,在SecurityManager构造方法里,若System.getSecurityManager()返回是null,则不会执行if语句里的权限检查代码块。小伙伴们可能就想,System里既然有getSecurityManager(),那肯定也有相关的set方法,当然,不然的话一直返回null那不就没有意义了吗,我们来看看:

public staticvoid setSecurityManager(final SecurityManager s) {try {s.checkPackageAccess("java.lang");} catch (Exception e) {// no-op}setSecurityManager0(s);}private static synchronizedvoid setSecurityManager0(final SecurityManager s) {SecurityManager sm &#61; getSecurityManager();if (sm !&#61; null) {// ask the currently installed security manager if we// can replace it.sm.checkPermission(new RuntimePermission("setSecurityManager"));}if ((s !&#61; null) && (s.getClass().getClassLoader() !&#61; null)) {AccessController.doPrivileged(new PrivilegedAction<Object>() {public Object run() {s.getClass().getProtectionDomain().implies(SecurityConstants.ALL_PERMISSION);return null;}});}security &#61; s;}

两个关于set的方法&#xff0c;我们来看最后一行代码 security &#61; s; 这里就是开始设置System类里的security变量&#xff0c;设置后返回就不会是null了&#xff0c;而s由setSecurityManager0方法参数传进来&#xff0c;setSecurityManager0由setSecurityManager调用&#xff0c;我们最后回归到第一个set方法&#xff0c;第一个set方法的s变量也由外部传入。我想了想&#xff0c;System类或者其他类里在进行某些操作时会不会有自动调用setSecurityManager的方法&#xff0c;很抱歉没有&#xff0c;所以总结出来&#xff0c;该方法需要我们手动调用并赋值&#xff0c;大家就可以简单理解为&#xff1a;

我们需要手动开启SecurityManager的安全检查&#xff0c;开启后SecurityManager即可为其他方法行为进行权限检查

//示例Runtime里的exit方法进行时就会进行行为检查
public void exit(int status) {SecurityManager security &#61; System.getSecurityManager();if (security !&#61; null) {security.checkExit(status);}Shutdown.exit(status);}

SecurityManager通过抛出异常来阻止没有权限或敏感操作的完成。 如果操作被允许执行&#xff0c;则简单的返回&#xff0c;如果操作被拒绝&#xff0c;则抛出一个SecurityException。 对于这种处理方式唯一的例外就是checkTopLevelWindow方法&#xff0c;此方法返回boolean值。

当前安全管理器被设置通过System类的setSecurityManager方法。获取当前安全管理器用System类的getSecurityManager方法。
SecurityManager中特定的方法checkPermission(java.security.Permission)负责明确允许还是拒绝由指定权限所指示的访问请求&#xff0c;默认的实现是&#xff1a;
AccessController.checkPermission(perm);
若果一个请求访问被允许&#xff0c;则checkPermission安静的返回&#xff0c;如果被拒绝&#xff0c;则抛出一个SecurityException异常。

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

权限分为以下类别&#xff1a;文件、套接字、网络、安全性、运行时、属性、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

//示例&#xff0c;通过Runtime类的exit方法中的security.checkExit(status)&#xff0c;我们来到SecurityManager类下的checkExit方法&#xff0c;该方法//就创建了RuntimePermission对象public void checkExit(int status) {checkPermission(new RuntimePermission("exitVM."&#43;status));}

除前两个&#xff08;FilePermission 和 SocketPermission&#xff09;类以外的所有类都是 java.security.BasicPermission 的子类&#xff0c;而 java.security.BasicPermission 类又是顶级权限类 java.security.Permission 的抽象子类. BasicPermission 定义了所有权限所需的功能&#xff0c;这些功能的名称遵从分层属性命名惯例&#xff08;例如“exitVM”、“setFactory”、“queuePrintJob”等等&#xff09;。在名称的末尾可能出现一个星号&#xff0c;前面是“.”或星号&#xff0c;这表示通配符匹配。例如&#xff1a;“a.”、“”是有效的&#xff0c;而“a”或“ab”是无效的。
FilePermission 和 SocketPermission 是顶级权限类 (java.security.Permission) 的子类。像这些命名语法比 BasicPermission 所用的语法更为复杂的类都直接是 Permission 的子类&#xff0c;而不是 BasicPermission 的子类。例如&#xff0c;对于 java.io.FilePermission 对象而言&#xff0c;权限名就是文件&#xff08;或目录&#xff09;的路径名。

某些权限类具有一个“动作”列表&#xff0c;告知允许对象所执行的动作。例如&#xff0c;对于 java.io.FilePermission 对象&#xff0c;动作列表&#xff08;如“读、写”&#xff09;指定了允许对指定文件&#xff08;或指定目录中的文件&#xff09;执行哪些动作。其他权限类是“指定的”权限 - 有名称但没有动作列表的类&#xff1b;您也许有指定的权限&#xff0c;也许没有。注&#xff1a;还有一个暗指所有权限的 java.security.AllPermission 权限。该权限是为了简化系统管理员的工作而存在的&#xff0c;因为管理员可能需要执行很多需要所有&#xff08;或许多&#xff09;权限的任务。

SecurityManager应用场景&#xff1a;

当运行未知的Java程序的时候&#xff0c;该程序可能有恶意代码&#xff08;删除系统文件、重启系统等&#xff09;&#xff0c;为了防止运行恶意代码对系统产生影响&#xff0c;需要对运行的代码的权限进行控制&#xff0c;这时候就要启用Java安全管理器。

启动安全管理器&#xff1a;


  • 参数启动&#xff08;指定 -Djava.security.manager&#xff09;
  • 通过程序打开SecurityManager SecurityManager sm &#61; new SecurityManager(); System.setSecurityManager(sm);

关闭安全管理器&#xff1a;

程序关闭&#xff1a; SecurityManager sm &#61; System.getSecurityManager(); if(sm !&#61; null){ System.setSecurityManager(null); }


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
author-avatar
弥囜_550
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有