热门标签 | 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 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
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社区 版权所有