1,什么是Java安全管理器?

SecurityManager
在看java源码的过程中,经常会遇到如下一段代码:

SecurityManager s = System.getSecurityManager();
ThreadGroup group = (s != null) ?
s.getThreadGroup():Thread.currentThread().getThreadGroup()

SecurityManager security = System.getSecurityManager();
if (security != null) {security.checkWrite(name);
}

要想了解它们有什么功能,就需要对Java安全管理器有一定的认识。

2,Java安全管理器的使用场景?

当运行未知的java程序时,该程序可能含有恶意代码,如删除系统文件等恶意操作,为了防止恶意代码对系统的破坏,需要对运行代码的权限进行控制,这时候就需要启用java安全管理器。

3,如何启用java安全管理器?

方式1:启动参数方式 (推荐方式)

-Djava.security.manager

若同时需要指定安全管理器配置文件的位置使用如下参数,默认的配置文件按在**$JAVA_HOME/jre/lib/security/java.policy**

-Djava.security.manager -Djava.security.policy="E:/java.policy"

虽然通过启动参数指定,本质上也是通过代码方式启动,但是方式更灵活。原理可查看启动类 sun.misc.Launcher类,有如下一段代码

public Launcher() {Launcher.ExtClassLoader var1;try {var1 = Launcher.ExtClassLoader.getExtClassLoader();} catch (IOException var10) {throw new InternalError("Could not create extension class loader", var10);}try {this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);} catch (IOException var9) {throw new InternalError("Could not create application class loader", var9);}Thread.currentThread().setContextClassLoader(this.loader);String var2 = System.getProperty("java.security.manager");if (var2 != null) {SecurityManager var3 = null;if (!"".equals(var2) && !"default".equals(var2)) {try {var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();} catch (IllegalAccessException var5) {} catch (InstantiationException var6) {} catch (ClassNotFoundException var7) {} catch (ClassCastException var8) {}} else {var3 = new SecurityManager();}if (var3 == null) {throw new InternalError("Could not create SecurityManager: " + var2);}System.setSecurityManager(var3);}}

方式2:编码方式启动(不推荐,不灵活)

System.setSecurityManager(new SecurityManager());

4,安全管理器配置文件解释

4.1 配置原则

  1. 没有配置的权限表示不具有权限
  2. 只能配置有什么权限,不能配置禁用什么权限
  3. 多种权限可用逗号分隔

4.2 配置文件解释

// 表示授权路径在 file:${{java.ext.dirs}}/*
// 的所有jar和class 文件具有他们的权限
grant codeBase "file:${{java.ext.dirs}}/*" {permission java.security.AllPermission;
};
grant {// 如下都是一些细粒度的权限,可查资料了解,举几个例子// 授权  运行时权限   通过stop来停止线程permission java.lang.RuntimePermission "stopThread";// 授权  socket权限  监听权限permission java.net.SocketPermission "localhost:0", "listen";// 能读取java版本的权限permission java.util.PropertyPermission "java.version", "read";permission java.util.PropertyPermission "java.vendor", "read";permission java.util.PropertyPermission "java.vendor.url", "read";permission java.util.PropertyPermission "java.class.version", "read";permission java.util.PropertyPermission "os.name", "read";permission java.util.PropertyPermission "os.version", "read";permission java.util.PropertyPermission "os.arch", "read";permission java.util.PropertyPermission "file.separator", "read";permission java.util.PropertyPermission "path.separator", "read";permission java.util.PropertyPermission "line.separator", "read";permission java.util.PropertyPermission "java.specification.version", "read";permission java.util.PropertyPermission "java.specification.vendor", "read";permission java.util.PropertyPermission "java.specification.name", "read";permission java.util.PropertyPermission "java.vm.specification.version", "read";permission java.util.PropertyPermission "java.vm.specification.vendor", "read";permission java.util.PropertyPermission "java.vm.specification.name", "read";permission java.util.PropertyPermission "java.vm.version", "read";permission java.util.PropertyPermission "java.vm.vendor", "read";permission java.util.PropertyPermission "java.vm.name", "read";
};

5,代码中使用java安全管理器场景

SecurityManager 实例包含了许多 checkXXX 的方法,表示检查是否具备对应的权限,如

sm.checkDelete("D:\\xx.txt");  // 是否具有指定文件的删除权限

当开启java安全管理器后,若没有对应的权限而执行了,就会抛出无权限的异常

Launcher failed - "Dump Threads" and "Exit" actions are unavailable (access denied ("java.io.FilePermission" "D:\install\IntelliJIDEA2020.1\bin\breakgen64.dll" "read"))
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "D:\xx.txt" "delete")at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)at java.security.AccessController.checkPermission(AccessController.java:886)at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)at java.lang.SecurityManager.checkDelete(SecurityManager.java:1007)at org.example.controller.SecurityManagerDemo.main(SecurityManagerDemo.java:8)

对于这类问题,我们只需要在安全管理器对应的配置文件中添加对应权限或者不启用安全管理器即可,如:

permission java.io.FilePermission "D:\\xx.txt","delete";

案例1:文件删除
查看 File 类的 delete 方法源码如下:

public boolean delete() {SecurityManager security = System.getSecurityManager();if (security != null) {security.checkDelete(path);}if (isInvalid()) {return false;}return fs.delete(this);}

可以看出,在执行删除时,会用先获取安全管理器,然后调用checkDelete(path) 方法,检查是否具有该文件的删除权限。

认识java安全管理器SecurityManager相关推荐

  1. Java安全管理器――SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...

  2. java安全管理器SecurityManager入门

    一.文章的目的 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题. 比如在阅读源码的时候,发现这样的代码,想了解是做什么的 ...

  3. java安全管理器SecurityManager

    一.文章的目的 这是一篇对Java安全管理器入门的文章,目的是简单了解什么是SecurityManager,对管理器进行简单配置,解决简单问题. 比如在阅读源码的时候,发现这样的代码,想了解是做什么的 ...

  4. java的安全管理器_Java安全管理器——SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...

  5. java安全管理器视频_java安全-安全管理器

    基本概念 安全管理器是一个负责控制具体操作是否允许执行的类,它主要负责检查的操作包括如下内容: 创建一个新的类加载器: 退出虚拟机 使用反射访问另一个类的成员 访问本地文件 打开socket连接 启动 ...

  6. Java 安全管理类SecurityManager

    背景 查看Druid源码时,发现类加载器ClassLoader.class中使用到SecurityManager ,所以查阅了下资料,进行下总结: private void checkPackageA ...

  7. java 的安全管理器

    安全管理器 SecurityManager 基本原理和使用方法 SecurityManager Policy 文件 AccessController java安全管理器概念 java安全管理器允许一个 ...

  8. Java安全:SecurityManager与AccessController

    前言 什么是安全? 程序不能恶意破坏用户计算机的环境,比如特洛伊木马等可自我进行复制的恶意程序. 程序不可获取主机及其所在网络的私密信息. 程序的提供者和使用者的身份需要通过特殊验证. 程序所涉及的数 ...

  9. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南20:使用安全管理器创建一个安全的沙盒...

    本节书摘来异步社区<Java编码指南:编写安全可靠程序的75条建议>一书中的第1章,第1.20节,作者:[美]Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达 ...

最新文章

  1. Node.js学习笔记(一)
  2. matlab怎么调用DeepLearn,使用DeepLearnToolbox-master中DBN工具箱做数据分类出现问题,求......
  3. centos7 yum安装 c c++ gcc gcc-c++
  4. 神经网络不收敛的查缺补漏
  5. asp.net问题点集合
  6. 3.高性能MySQL --- 服务器性能剖析( 2 )
  7. 均值模糊调试遇到的问题
  8. 04MVC、RPC、SOA、微服务架构区别
  9. 【杆号识别】基于matlab铁路接触网系统杆号识别【含Matlab源码 1056期】
  10. BFS(广度优先算法)
  11. 5学工坊整理|关于大数据发展趋势
  12. 贪心——Berserk And Fireball
  13. Fires Dynamics Simulator(FDS)软件运行代码说明
  14. SEO入门知识2:不同角度看seo
  15. EXCEL根据两点经纬度计算距离
  16. 2021全球程序员收入报告出炉,字节高级码农年薪274万元排第5!
  17. 如何在oracle官网下载ojdbc8,想不想在maven里直接下载ojdbc这个jar?
  18. 解决Mysql:Incorrect string value: '\xF0\x9F\x8D\x83\xF0\x9F...' for column
  19. Redis数据库 专题
  20. 限定性定语从句和非限定性定语从句的区别

热门文章

  1. 【系统分析师之路】计算机组成原理章节错题集锦
  2. 如何查看自己电脑应该买什么样的内存条
  3. 电脑加一个固态硬盘,如何修改电脑的启动项。
  4. biabiamiamia百度音乐网批量歌曲下载工具
  5. 计算机考研全国统考时段,考研初试各科目时间安排
  6. 【100%通过率】华为OD机试真题 Python 实现【预订酒店】【2022.11 Q4 新题】
  7. 全球与中国3D透视导航技术市场现状及未来发展趋势(2022)
  8. LeetCode231打家劫社Ⅱ(动态规划)
  9. PyPDF2读取PDF文件内容保存到本地TXT
  10. 【在SpringBoot项目中使用Validation框架检查数据格式-常用的检查注解】