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.mzph.cn/news/808987.shtml

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

相关文章

D-LinkNAS 远程命令执行漏洞(CVE-2024-3273)RCE漏

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 D-LinkNAS是由D-Link公司制造的网络附加存储设备。…

SOLIDOWRKS怎么将中间格式的模具装配体转化为装配体格式

模具是工业生产中用于制作成型物品的工具&#xff0c;它由各种零件构成&#xff0c;可以通过改变所成型材料的物理状态来实现物品外形的加工。如果工程师已经有其他格式的模具装配体&#xff0c;但是又想将其他格式的模具装配体导入solidworks里面&#xff0c;并且将一个个实体…

数字人项目 ER-NeRF 的使用和部署详细教程

文章目录 1. ER-NeRF简介2. ER-NeRF部署3. 训练自己的数字人4. 生成数字人视频5. 其他数字人模型比较常见错误 1. ER-NeRF简介 ER-NeRF&#xff08;官方链接&#xff09;是一个Talking Portrait Synthesis&#xff08;对嘴型&#xff09;项目。即&#xff1a;给一段某人说话的…

Linux网络基础2(下)

传输层 再谈端口号端口号的划分netstatpidof UDP协议 UDP的特点UDP缓冲区UDP使用注意事项UDP报头的理解基于UDP的应用层协议 TCP协议 4位首部长度16位窗口大小确认应答机制32位序号和32位确认序号6个标记位超时重传机制连接管理机制流量控制快重传机制再谈序号延迟应答面相字节…

知识图谱与人工智能:携手共进

知识图谱与人工智能&#xff1a;携手共进 一、引言&#xff1a;知识图谱与人工智能的融合 在这个数据驱动的时代&#xff0c;知识图谱与人工智能&#xff08;AI&#xff09;之间的融合不仅是技术发展的必然趋势&#xff0c;也是推动各行各业创新的关键。知识图谱&#xff0c;作…

游戏行业科普 (二)游戏是怎么做出来,怎么卖出去的?

游戏行业科普系列文章&#xff0c;大家可以关注起来&#xff0c;等我慢慢芬分享~~ 《蛋仔派对》 一、研运流程--游戏是怎么做出来的 一款游戏的开发和运营大体上可以分为预研立项、设计开发、测试调优、发行上线和成熟运营几个阶段。 1&#xff09;预研立项&#xff1a; 初始研…

贪心算法|56.合并区间

力扣题目链接 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() 0) return result; // 区间集合为空直接返回// 排序的参数使用了lambda表达…

Nginx的基本使用

目录 介绍Nginx&#xff1a; 其优点有很多&#xff1a; 如何下载Nginx&#xff1a; 下载Nginx 启动Nginx ​编辑 如何用Nginx创建网站 Nginx自带的网站 分析网页 转变ip地址为自己的网页 换内容 换文件 介绍Nginx&#xff1a; Nginx是一个高性能的HTTP和反向代理w…

如何将普通maven项目转为maven-web项目

文件-项目结构&#xff08;File-->Project Structure &#xff09; 模块-->learn&#xff08;moudle-->learn&#xff09; 选中需要添加web的moudle&#xff0c;点击加号&#xff0c;我得是learn&#xff0c;单击选中后进行下如图操作&#xff1a; 编辑路径 结果如下…

Open CASCADE学习|BrepOffsetAPI_ThruSections无法放样成Solid

目录 1、边界线&#xff08;TopoDS_Wire&#xff09;不在一个平面上时&#xff0c;无法生成Solid 2、边界线&#xff08;TopoDS_Wire&#xff09;在一个平面上时&#xff0c;可以生成Solid 3、边界线&#xff08;TopoDS_Wire&#xff09;不在一个平面上时&#xff0c;添加To…

【vue】v-model 双向数据绑定

:value&#xff1a;单向数据绑定v-model&#xff1a;双向数据绑定 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

学习云计算HCIE选择誉天有什么优势?

誉天云计算课程优势实战性强 课程注重实践操作&#xff0c;通过实际案例和实验操作&#xff0c;让学员深入了解云计算的应用场景和实际操作技能。课程内容全面 涵盖所有云计算涉及的IT基础知识、服务器、存储、网络等方面的基础知识&#xff0c;开源操作系统Linux&#xff0c;开…

Python(1):认识Python并且了解一些简单函数

文章目录 一、Python的优势及其使用场景二、Python环境的安装三、Python中的变量及其命名四、Python中的注释五、一些简单常见的函数和认识ASCII表六、Python导入模块的方式 一、Python的优势及其使用场景 优点&#xff1a; 开发效率高&#xff1a;Python具有非常强大的第三方…

设计模式代码实战-工厂模式

1、问题描述 小明家有两个工厂&#xff0c;一个用于生产圆形积木&#xff0c;一个用于生产方形积木&#xff0c;请你帮他设计一个积木工厂系统&#xff0c;记录积木生产的信息。 输入案例 3 Circle 1 Square 2 Circle 1 2、工厂模式 将产品的创建过程封装在⼀个⼯⼚类中&am…

我国量子信息科技创新发展面临的挑战及建议——基于中美对比视角的分析

2024年2月&#xff0c;中国科学技术发展战略院慕慧娟博士、丁明磊研究员及光子盒顾成建一起在《科技管理研究》上发表文章——《我国量子信息科技创新发展面临的挑战及建议&#xff1a;基于中美对比视角的分析》。 在此&#xff0c;我们整理并发布这篇文章&#xff0c;欢迎感兴…

librosa.beat.beat_track()报错解决记录

在使用librosa.beat.beat_track(yy, srsr)时报错&#xff1a;AttributeError: module scipy.signal has no attribute hann&#xff0c;很奇怪的问题&#xff0c;大家好像都没有遇到这个错误&#xff1a; 很奇怪&#xff0c;这个hann明明是scipy.signal.windows里面的。。虚拟环…

OpenHarmony4.0分布式任务调度浅析

1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制&#xff0c;包括服务发现、同步、注册和调用等环节&#xff0c;实现了对跨设备的应用进行远程启动、远程调用、…

物联网在工业中的应用是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网在工业中的应用已经日益广泛&#xff0c;它为企业带来了前所未有的机会和挑战。物联网技术通过连接各种设备和系统&#xff0c;实现了数据的实时采集、分析和优化&#xff0c;从而提高了生产效率、降低了成本并提升了企业的竞争力。…

基于WEB的水库水情自动测报系统的研究与设计(论文+源码)_kaic

摘要 水情信息是水利管理最重要的基础信息&#xff0c;是水文预报、水资源管理、防汛抗旱决策的主要依据。水情自动测报系统是一个自动采集、传输、处理水情信息的实时测报系统&#xff0c;可对水库流域内的水情、水文和气象数据&#xff0c;如雨量、流量、水位等&#xff0c;实…

动态规划-入门三道题

1137. 第 N 个泰波那契数 题目描述&#xff1a; 状态表示: dp[i]表示第i个泰波那契数。 状态转移方程&#xff1a; dp[i]dp[i-3]dp[i-2]dp[i-1]。 初始化: 动态规划问题的初始化就是为了去避免初始情况下的越界问题。这里就对dp[0]0,dp[1]1,dp[2]1这样进行初始化即可&#xf…