Java安全管理器-SecurityManager

定义:

SecurityManager是Java中的一个类,用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理,并控制哪些操作可以执行,哪些应该被拒绝。主要功能包括:

  • 安全策略管理:SecurityManager允许定义一组安全策略,这些策略规定了在运行时哪些操作是允许的,哪些是禁止的。

  • 权限控制:通过SecurityManager可以控制对敏感资源的访问权限,比如文件系统、网络等。

  • 安全检查:在应用程序执行敏感操作之前,SecurityManager可以进行安全检查,以确保当前线程是否有权限执行该操作。

  • 自定义安全策略:开发人员可以扩展SecurityManager类,实现自定义的安全策略,以满足特定应用程序的安全需求。

尽管SecurityManager提供了强大的安全管理功能,但在现代Java应用程序中,它已经不太常用了。相反,通常会使用更先进的安全解决方案,如安全框架、安全协议等来提供更全面和灵活的安全保护。

沙箱

其实在了解这个SecurityManager 的同时,应该了解一下代码沙箱(sandbox)。是一种安全机制,用于在受信任的环境中执行不受信任的代码,以防止恶意行为或不良影响。它通常用于网络浏览器、虚拟机、容器等环境中,以限制代码的访问权限和影响范围。
在网络浏览器中,代码沙箱允许网页上的 JavaScript 代码在受控制的环境中运行,以防止恶意代码对用户数据或系统的损害。通过沙箱,浏览器可以限制 JavaScript 代码对浏览器 API 和用户系统的访问权限,从而保护用户隐私和系统安全。
在虚拟机和容器中,代码沙箱用于隔离不同的应用程序或服务,以防止其中一个应用程序对其他应用程序或主机系统造成损害。通过沙箱,每个应用程序或服务都被限制在自己的受控环境中运行,不能访问或影响其他应用程序或主机系统。

如何保护代码沙箱呢?

这里就需要我们的安全管理器了SecurityManager,定义了很多权限。我们可以自定义一个类来继承SecurityManager这个类。如下图:
在这里插入图片描述
我们这里定义了一个DefaultSecurityManager 类。默认的安全管理器。继承SecurityManager,实现checkPermission方法来进行拦截权限的校验。
当然我们可以使用我们自定义类来编写各种权限的接口哈。
比如:我们创建一个MySecurityManager 类。继承SecurityManager方法。我们可以看看里面都可以实现什么样子的方法。有点像MyBatisPlus。里面已经给你封好方法
在这里插入图片描述
这里我实现了几个常用的方法

/*** 我的安全管理器*/
public class MySecurityManager extends SecurityManager {@Overridepublic void checkPermission(Permission perm) {//默认情况下,不做任何检查  所有权限放开
//        super.checkPermission(perm);}/*** 检查执行系统命令的权限。** @param cmd the specified system command.*/@Overridepublic void checkExec(String cmd) {throw new SecurityException("checkExec 权限异常:" + cmd);}/*** 检查读取文件的权限。是否允许读文件** @param file the system-dependent filename.*/@Overridepublic void checkRead(String file) {if (file.contains("F:\\Code\\CaDaOJ-code-sandbox\\")) {return;//放行}throw new SecurityException("checkRead权限异常:" + file);}/*** 检查写文件的权限。** @param file the system-dependent filename.*/@Overridepublic void checkWrite(String file) {throw new SecurityException("checkWrite 权限异常:" + file);}/*** 检查删除文件的权限。** @param file the system-dependent filename.*/@Overridepublic void checkDelete(String file) {throw new SecurityException("checkDelete 权限异常:" + file);}/*** 检查程序是否可以连接网络** @param host the host name port to connect to.* @param port the protocol port to connect to.*/@Overridepublic void checkConnect(String host, int port) {throw new SecurityException("checkConnect权限异常:" + host + ":" + port);}
}

启动

在我们需要校验的地方直接加上这句话

System.setSecurityManager(new DefaultSecurityManager())

实际运用

实际情况下,不应该在主类中做限制,只需要限制子程序的权限即可。

启动子进程执行命令时,设置安全管理器,而不是在外层设置。
当然也可以把他整成一个配置文件。把它放到 resources/security目录下,配置类编写成一个Java源文件,然后使用Java编译器将其编译成字节码文件(.class),最后将这个字节码文件作为资源打包到你的应用程序中。
注意:移除类的包名!移除类的包名!移除类的包名!
创建一个Java源文件,命名为MySecurityManager.java,包含你的配置类代码:

import java.security.Permission;public class MySecurityManager extends SecurityManager {@Overridepublic void checkPermission(Permission perm) {// 在这里实现你的权限检查逻辑// 这只是一个简单的示例,可以根据具体情况进行修改if (perm.getName().equals("setSecurityManager")) {// 如果试图设置SecurityManager,则抛出SecurityExceptionthrow new SecurityException("权限不足");}}// 其他重写的checkXXX方法根据需要进行实现// 例如:checkRead、checkWrite等等
}

使用Java编译器(javac)编译MySecurityManager.java文件,生成字节码文件MySecurityManager.class:
javac MySecurityManager.java
在你的应用程序中,使用ClassLoader加载嵌入的MySecurityManager类:

import java.io.InputStream;public class Main{public static void main(String[] args) {// 使用ClassLoader加载嵌入的资源文件ClassLoader classLoader = MyApp.class.getClassLoader();try (InputStream inputStream = classLoader.getResourceAsStream("MySecurityManager.class")) {byte[] buffer = new byte[inputStream.available()];inputStream.read(buffer);// 使用defineClass方法加载类Class<?> mySecurityManagerClass = ClassLoader.defineClass("MySecurityManager", buffer, 0, buffer.length);// 创建并设置自定义的SecurityManagerSecurityManager sm = (SecurityManager) mySecurityManagerClass.getDeclaredConstructor().newInstance();System.setSecurityManager(sm);// 程序的其他逻辑...} catch (Exception e) {e.printStackTrace();}}
}

这样,你就可以将配置类作为资源嵌入到你的应用程序中,并在运行时使用ClassLoader加载它,从而设置自定义的SecurityManager。请注意,这种方法可能会增加应用程序的复杂性,建议在需要时使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/610187.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注意力机制篇 | YOLOv8改进之清华开源ACmix:自注意力和CNN的融合 | 性能速度全面提升

前言:Hello大家好,我是小哥谈。混合模型ACmix将自注意力机制和卷积神经网络进行整合,使其同时具有自注意力机制和卷积神经网络的优点。这是清华大学、华为和北京人工智能研究院共同发布在2022年CVPR中的论文。ACmix结合了自注意力机制和卷积神经网络的优势,以提高模型的性能…

【Java+Springboot】------ 通过JDBC+GetMapping方法进行数据select查询、多种方式传参、最简单的基本示例!

一、JDBC如何使用、PostGresql数据库 1、在pom.xml 先引用jdbc组件。 <!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> 2、在pom.xml 再引用p…

为什么在学校很难真正学好嵌入式?

10几年前,我是读电气工程专业,学了很多东西,结构,电机、绘图,plc等等.. 其实,都没什么鸟用,出来还是像个废物。 后面我自学转了单片机开发,说句难听点,自己买个开发板都比在学校学得深。 可能是这个专业的问题,主攻不是嵌入式方向,老师用汇编点个流水灯,这门课就…

Vue结合el-table实现合并单元格(以及高亮单元表头和指定行)

实现效果如下&#xff1a; 思路&#xff1a; 1.首先使用动态表头表格。 2.其次实现动态计算合并单元格。&#xff08;计算规则 传递需要合并的字段&#xff09; 3.然后封装公共的计算单元格方法 export导出供多个页面使用。 4.同时需要封装成公共的组件供多个页面使用。 5…

代码随想录算法训练营第五十一天 |309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

代码随想录算法训练营第五十一天 |309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费 309. 买卖股票的最佳时机含冷冻期题目解法 714. 买卖股票的最佳时机含手续费题目解法 感悟 309. 买卖股票的最佳时机含冷冻期 题目 解法 题解链接 1. class Solution { …

国内低代码平台盘点:专家推荐值得收藏

随着数字化转型的浪潮不断推进&#xff0c;企业对快速构建和部署应用系统的需求日益迫切。在这样的背景下&#xff0c;低代码平台应运而生&#xff0c;成为企业实现快速应用开发的利器。近几年&#xff0c;低代码行业软件市场蓬勃发展&#xff0c;涌现出了一批优秀的软件产品&a…

贪心算法|763.划分字母区间

力扣题目链接 class Solution { public:vector<int> partitionLabels(string S) {int hash[27] {0}; // i为字符&#xff0c;hash[i]为字符出现的最后位置for (int i 0; i < S.size(); i) { // 统计每一个字符最后出现的位置hash[S[i] - a] i;}vector<int> …

SAP HCM get pernr无法查询到主数据

今天遇到一个比较奇怪的问题&#xff0c;就是ger pernr在2月的时候能找到员工主数据&#xff0c;但是在3月的时候无法找到员工主数据。首先SE36&#xff1a;逻辑数据库页面&#xff0c;看看标准逻辑数据库执行&#xff0c;是否能获取数据。 从上述标准的逻辑书而言&#xff0c;…

防火墙用户管理技术——AAA

目录 一.AAA功能 (1).认证方式 (2).授权方式 (3).计费方式 二.RADUIUS协议 三.用户组织架构及管理 管理员认证登录方式 1.console 2.web 3.telnet 4.ssh 5.ftp 四.认证方式 五.AAA远程登录 1.端口添加IP地址达到互通 2.AAA视图进行配置 3.结果​编辑 一.AAA功能…

RAG应用开发实战(01)-RAG应用框架和解析器

1 开源解析和拆分文档 第三方的工具去对文件解析拆分&#xff0c;去将我们的文件内容给提取出来&#xff0c;并将我们的文档内容去拆分成一个小的chunk。常见的PDF word mark down, JSON、HTML。都可以有很好的一些模块去把这些文件去进行一个东西去提取。 优势 支持丰富的文…

开放式耳机什么牌子好?专业数码博主测评级推荐

有人说&#xff0c;开放式耳机就像是给耳朵的一次解放。它们不像传统的耳机那样把我们的耳朵紧紧包围&#xff0c;而是让音乐在空气中自由流动&#xff0c;给我们带来一种全新的听觉体验。这种耳机不仅能够让我们在音乐中找到乐趣&#xff0c;还能够让我们感受到周围的世界。 …

无人机概述

1、中英文对照表 中文中文简称英文全称英文简称无人驾驶飞机无人机Unmanned Aerial VehicleUAV无人机自组织网络无人机网络flying Ad-Hoc networkFANET 2、相关概念 2.1鲁棒性 网络鲁棒性是指网络系统在面对随机故障、蓄意攻击或其他异常情况时&#xff0c;能够保持其基本功…