博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java jvm学习笔记六(实现写自己的安全管理器)
阅读量:6368 次
发布时间:2019-06-23

本文共 2874 字,大约阅读时间需要 9 分钟。

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

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

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

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

 

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

package com.yfq.test;import java.io.FileInputStream;import java.io.IOException;public class TestMySecurityManager {    public static void main(String[] args) {        System.setSecurityManager(new MySecurityManager());        try {            FileInputStream fis = new FileInputStream("test");            System.out.println(fis.read());        } catch (IOException e) {            e.printStackTrace();        }    }}

 

  

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

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的构造函数里,下面贴出代码,简单阅读一下

public FileInputStream(File file) throws FileNotFoundException {    String name = (file != null ? file.getPath() : null);    SecurityManager security = System.getSecurityManager();    if (security != null) {        security.checkRead(name);    }        if (name == null) {            throw new NullPointerException();        }    fd = new FileDescriptor();    open(name);    }

 

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

 

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

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

 

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

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

 

申明:文章的部分内容有参照网上的其他作者的内容,这里只用来学习交流!

转载于:https://www.cnblogs.com/lijia0511/p/4973791.html

你可能感兴趣的文章
Nutch1.7学习笔记:基本环境搭建及使用
查看>>
kpvalidate开辟验证组件,通用Java Web请求服务器端数据验证组件
查看>>
用Chart控件绘制动态图表
查看>>
数字信号处理之低通滤波器设计
查看>>
Learning Cocos2d-x for WP8(3)——文字篇
查看>>
转 AngularJS 2.0将面向移动应用并放弃旧浏览器
查看>>
Leetcode: Swap Nodes in Pairs
查看>>
学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
查看>>
webservice2
查看>>
求最大公约数和小于n的所有质数
查看>>
Length of Last Word
查看>>
NFS(Network File System)服务配置和使用
查看>>
开源的PaaS方案:在OpenStack上部署CloudFoundry (五)常见问题
查看>>
java 字符串格式化
查看>>
支付宝申请到编码流程
查看>>
ZOJ 3872--解题报告
查看>>
为什么整个互联网行业都缺前端工程师?
查看>>
《GK101任意波发生器》升级固件发布(版本:1.0.2build851)
查看>>
Centos6.4下安装protobuf及简单使用
查看>>
android代码签名和混乱的包装
查看>>