安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂得多,这里我只是简单的一句带过,因为这里涉及到很多比较后面的知识点。

下面来尝试一下写一个非常简单的demo,旨在让你有一个比较形象的思维,不会在概念上打转。

第一步,定义一个类继承自SecurityManger重写它的checkRead方(如果你有兴趣可以先跳到super.checkRead(file, context);看看,当然不看也没有关系,我们后面的章节会基于这个demo做扩展的时候也会讲到)。

  1. package com.yfq.test;
  2. public class MySecurityManager extends SecurityManager {
  3. @Override
  4. public void checkRead(String file) {
  5. //super.checkRead(file, context);
  6. if (file.endsWith("test"))
  7. throw new SecurityException("你没有读取的本文件的权限");
  8. }
  9. }

第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。

  1. package com.yfq.test;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. public class TestMySecurityManager {
  5. public static void main(String[] args) {
  6. System.setSecurityManager(new MySecurityManager());
  7. try {
  8. FileInputStream fis = new FileInputStream("test");
  9. System.out.println(fis.read());
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }

第三步,运行代码查看控制台输出

Exception in thread "main" Java.lang.SecurityException: 你没有读取的本文件的权限
 at com.yfq.test.MySecurityManager.checkRead(MySecurityManager.java:9)
 at java.io.FileInputStream.<init>(FileInputStream.java:100)
 at java.io.FileInputStream.<init>(FileInputStream.java:66)
 at com.yfq.test.TestMySecurityManager.main(TestMySecurityManager.java:10)

从上面的异常我们发现,安全管理器起作用了。读过笔记四的人应该会发现,这里我们用到了一个笔记四提到的方法:System.setSecurityManager(new MySecurityManager());这个是安装安全管理器的另外一种方法,笔记四中我们曾经用-Djava.security.manager安装过默认的安全管理器,有印象不?

拓展内容

好了,我们的安全管理器是怎么被执行的呢?如果你有兴趣可以继续往下看一下,也可以跳过,这里只是简单的介绍一下,也是本人习惯的学习思路

直接跳到FileInputStream的构造函数里,下面贴出代码,简单阅读一下

  1. public FileInputStream(File file) throws FileNotFoundException {
  2. String name = (file != null ? file.getPath() : null);
  3. SecurityManager security = System.getSecurityManager();
  4. if (security != null) {
  5. security.checkRead(name);
  6. }
  7. if (name == null) {
  8. throw new NullPointerException();
  9. }
  10. fd = new FileDescriptor();
  11. open(name);
  12. }

发现没?它首先执行SecurityManager security = System.getSecurityManager();,然后再调用security的checkRead方法,就是这么简单。

如果你还有兴趣那么继续往下读,在使用java的File时,你是否用过setWritable(boolean, boolean),让你可以指定创建文件的权限,学习了安全管理器之后你有没有有豁然开朗的感觉,它是怎么实现的,相信你已经猜到了,没有错就是安全管理器设置权限啦。下面贴出它的代码,同时也引入一个新的概念Permission

  1. public boolean setWritable(boolean writable, boolean ownerOnly) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4. security.checkWrite(path);
  5. }
  6. return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly);
  7. }

Permisson就是权限的意思,它仅仅取出安全管理器然后将文件的权限设置了一下而已,这个也是后面所有关于权限的一个不可或缺的类!

好了今天的文件安全管理器demo就到这里。意在浅显易懂!

java之jvm学习笔记六(实践写自己的安全管理器)的更多相关文章

  1. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  4. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  5. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  6. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  7. java jvm学习笔记六(实现写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  8. java虚拟机JVM学习笔记-基础知识

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--java虚拟机 媒介:JVM是每一位从事Java开发工程师必须翻越的一座大山! JVM(Java Virtual Machine)JRE ...

  9. CSS学习笔记六:写原生导航栏

    因为刚开始学习CSS时,只了解了一些基本样式,然后就跑去学习bootstrap.bootstrap是个不错的东西,挺好玩,起码让你写界面写的轻轻松松,几行引入代码,再来个复制粘贴就解决了,而且boot ...

随机推荐

  1. shutil库文件的操作

    一.拷贝,移动,改名 import shutil old_file=r"C:\Users\ffm11\Desktop\AI.docx" new_file=r"C:\Use ...

  2. Sqli labs系列-less-1 详细篇

    要说 SQL 注入学习,网上众多的靶场,就属 Sqli labs 这个系列挺不错的,关卡达到60多关了,我自己也就打了不几关,一个挺不错的练习SQL注入的源码. 我一开始就准备等我一些原理篇总结完了, ...

  3. (转)Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

    转:http://blog.csdn.net/coding_me/article/details/39524137 SASL  的认证方式包括:     1. PLAIN:plain是最简单的机制,但 ...

  4. spring AOP (使用AspectJ的xml方式 的aop实现) (7)

    目录 一.定义计算器接口跟实现类 二.定义两个切面,日志切面和验证切面 三.在xml中配置切面 四.测试类 一.定义计算器接口跟实现类 public interface ArithmeticCalcu ...

  5. ORM-Dapper:Dapper列表

    ylbtech-ORM-Dapper:Dapper列表 1.返回顶部 1.1. https://dapper-tutorial.net/ 1.2. 2.1. https://www.nuget.org ...

  6. This inspection detects shadowing names defined in outer scopes.

    错误信息:This inspection detects shadowing names defined in outer scopes. 检查到波浪处的单词已在函数外部定义. 解决:使用global ...

  7. bootstrap Modal 模态框垂直居中

    解决 Modal 垂直居中的问题,上网找了好多博客,有好多说改源码的,这个并没有实践. 但发现另一种解决办法,可以实现,代码如下: function centerModals(){ $('.modal ...

  8. MySQL将查询结果写入到文件的2种方法

    1.SELECT INTO OUTFIL: 这种方法不能覆盖或者追加到已经存在的文件,只能写入到新文件,并且建立文件的路径需要mysql进程用户有权限建立新文件. mysql 61571 60876 ...

  9. PS--工具类

    1.移动工具 快捷点Vctrl + 点击想要移动的图层.选中后,就可以移动了. 2.选取工具 快捷键M2.1选取后填充颜色:新建图层 选取 右键填充 添加前景色 2.2两块选区选择一个选区后,属性面板 ...

  10. POJ 2135 /// 最小费用流最大流 非负花费 BellmanFord模板

    题目大意: 给定一个n个点m条边的无向图 求从点1去点n再从点n回点1的不重叠(同一条边不能走两次)的最短路 挑战P239 求去和回的两条最短路很难保证不重叠 直接当做是由1去n的两条不重叠的最短路 ...