热门标签 | 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); }


推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
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社区 版权所有