Java安全管理器-SecurityManager

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

定义:

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


  • 安全计谋管理:SecurityManager答应定义一组安全计谋,这些计谋规定了在运行时哪些操作是答应的,哪些是克制的。
  • 权限控制:通过SecurityManager可以控制对敏感资源的访问权限,比如文件体系、网络等。
  • 安全查抄:在应用程序实行敏感操作之前,SecurityManager可以进行安全查抄,以确保当火线程是否有权限实行该操作。
  • 自定义安全计谋:开发人员可以扩展SecurityManager类,实现自定义的安全计谋,以满足特定应用程序的安全需求。
只管SecurityManager提供了强大的安全管理功能,但在当代Java应用程序中,它已经不太常用了。相反,通常会利用更先进的安全解决方案,如安全框架、安全协议等来提供更全面和灵活的安全保护。
沙箱

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

这里就须要我们的安全管理器了SecurityManager,定义了很多权限。我们可以自定义一个类来继续SecurityManager这个类。如下图:

我们这里定义了一个DefaultSecurityManager 类。默认的安全管理器。继续SecurityManager,实现checkPermission方法来进行拦截权限的校验。
当然我们可以利用我们自定义类来编写各种权限的接口哈。
比如:我们创建一个MySecurityManager 类。继续SecurityManager方法。我们可以看看里面都可以实现什么样子的方法。有点像MyBatisPlus。里面已经给你封好方法

这里我实现了几个常用的方法
  1. /**
  2. * 我的安全管理器
  3. */
  4. public class MySecurityManager extends SecurityManager {
  5.     @Override
  6.     public void checkPermission(Permission perm) {
  7.         //默认情况下,不做任何检查  所有权限放开
  8. //        super.checkPermission(perm);
  9.     }
  10.     /**
  11.      * 检查执行系统命令的权限。
  12.      *
  13.      * @param cmd the specified system command.
  14.      */
  15.     @Override
  16.     public void checkExec(String cmd) {
  17.         throw new SecurityException("checkExec 权限异常:" + cmd);
  18.     }
  19.     /**
  20.      * 检查读取文件的权限。是否允许读文件
  21.      *
  22.      * @param file the system-dependent filename.
  23.      */
  24.     @Override
  25.     public void checkRead(String file) {
  26.         if (file.contains("F:\\Code\\CaDaOJ-code-sandbox\")) {
  27.             return;//放行
  28.         }
  29.         throw new SecurityException("checkRead权限异常:" + file);
  30.     }
  31.     /**
  32.      * 检查写文件的权限。
  33.      *
  34.      * @param file the system-dependent filename.
  35.      */
  36.     @Override
  37.     public void checkWrite(String file) {
  38.         throw new SecurityException("checkWrite 权限异常:" + file);
  39.     }
  40.     /**
  41.      * 检查删除文件的权限。
  42.      *
  43.      * @param file the system-dependent filename.
  44.      */
  45.     @Override
  46.     public void checkDelete(String file) {
  47.         throw new SecurityException("checkDelete 权限异常:" + file);
  48.     }
  49.     /**
  50.      * 检查程序是否可以连接网络
  51.      *
  52.      * @param host the host name port to connect to.
  53.      * @param port the protocol port to connect to.
  54.      */
  55.     @Override
  56.     public void checkConnect(String host, int port) {
  57.         throw new SecurityException("checkConnect权限异常:" + host + ":" + port);
  58.     }
  59. }
复制代码
启动

在我们须要校验的地方直接加上这句话
  1. System.setSecurityManager(new DefaultSecurityManager())
复制代码
实际运用

实际环境下,不应该在主类中做限制,只须要限制子程序的权限即可。
启动子进程实行下令时,设置安全管理器,而不是在外层设置。
当然也可以把他整成一个设置文件。把它放到 resources/security目录下,设置类编写成一个Java源文件,然后利用Java编译器将其编译成字节码文件(.class),最后将这个字节码文件作为资源打包到你的应用程序中。
注意:移除类的包名!移除类的包名!移除类的包名!
创建一个Java源文件,定名为MySecurityManager.java,包含你的设置类代码:
  1. import java.security.Permission;
  2. public class MySecurityManager extends SecurityManager {
  3.     @Override
  4.     public void checkPermission(Permission perm) {
  5.         // 在这里实现你的权限检查逻辑
  6.         // 这只是一个简单的示例,可以根据具体情况进行修改
  7.         if (perm.getName().equals("setSecurityManager")) {
  8.             // 如果试图设置SecurityManager,则抛出SecurityException
  9.             throw new SecurityException("权限不足");
  10.         }
  11.     }
  12.     // 其他重写的checkXXX方法根据需要进行实现
  13.     // 例如:checkRead、checkWrite等等
  14. }
复制代码
利用Java编译器(javac)编译MySecurityManager.java文件,天生字节码文件MySecurityManager.class:
javac MySecurityManager.java
在你的应用程序中,利用ClassLoader加载嵌入的MySecurityManager类:
  1. import java.io.InputStream;
  2. public class Main{
  3.     public static void main(String[] args) {
  4.         // 使用ClassLoader加载嵌入的资源文件
  5.         ClassLoader classLoader = MyApp.class.getClassLoader();
  6.         try (InputStream inputStream = classLoader.getResourceAsStream("MySecurityManager.class")) {
  7.             byte[] buffer = new byte[inputStream.available()];
  8.             inputStream.read(buffer);
  9.             // 使用defineClass方法加载类
  10.             Class<?> mySecurityManagerClass = ClassLoader.defineClass("MySecurityManager", buffer, 0, buffer.length);
  11.             // 创建并设置自定义的SecurityManager
  12.             SecurityManager sm = (SecurityManager) mySecurityManagerClass.getDeclaredConstructor().newInstance();
  13.             System.setSecurityManager(sm);
  14.             // 程序的其他逻辑...
  15.         } catch (Exception e) {
  16.             e.printStackTrace();
  17.         }
  18.     }
  19. }
复制代码
这样,你就可以将设置类作为资源嵌入到你的应用程序中,并在运行时利用ClassLoader加载它,从而设置自定义的SecurityManager。请注意,这种方法可能会增长应用程序的复杂性,发起在须要时利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表