jvm安全管理器的实现机制

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

                下面来尝试一下写一个很是简单的demo,旨在让你有一个比较形象的思惟,不会在概念上打转。安全

                第一步,定义一个类继承自SecurityManger重写它的checkRead方(若是你有兴趣能够先跳到super.checkRead(file, context);看看,固然不看也没有关系,咱们后面的章节会基于这个demo作扩展的时候也会讲到)。ide

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)this

 从上面的异常咱们发现,安全管理器起做用了。这里咱们用到了一个方法:System.setSecurityManager(new MySecurityManager());这个是安装安全管理器的另一种方法,能够用-Djava.security.manager安装默认的安全管理器设计

拓展内容code

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

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

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就是权限的意思,它仅仅取出安全管理器而后将文件的权限设置了一下而已,这个也是后面全部关于权限的一个不可或缺的类!

相关文章
相关标签/搜索