java jvm学习笔记十(策略和保护域)

时间:2022-01-06 23:25:56

        欢迎转载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271415

前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也顺带的讲了一下什么是策略,还有策略的作用。

为了引出另外一个很重要的概念ProtectionDomain(保护域),所以我们还是要先来回顾一下什么是策略

                        首先,什么是策略,今天的东西纯粹是比较概念的。当然,如果你读过笔记九,今天的东西,就真的是soso

策略与策略文件:

java对应用程序的访问控制策略是由抽象类java.security.Policy的一个子类的单例所表示,任何时候,每个应用程序实际上只有一个Policy对象,Policy对象对应着策略文件。类装载器利用这个Policy对象来帮助他们决定,在把一段代码导入虚拟机时应该给予什么权限。

上面那段话告诉我们一个应用程序对应一个策略对象,一个策略对象对应一个策略文件。

                        那么策略文件,除了对我们笔记九中一个文件夹下的所有文件起限制作用外还能对什么主体起作用呢?先来看看下面的策略文件myPolicy.txt

简单的解读一下

第一行:keystore "ijvmkeys",这一行的意思,密钥对存放在当前目录一个叫ijvmkeys的文件里(记得笔记八做过的jar包签名实验吗)

第二行:grant signedby "friend",grant是授权的意思,这一行的意思是,给一个被“friend”的密钥对签名的文件授权

第三行:permission java.io.FilePermission "d:/testPolicy.txt", "read,write";这行的意思是对于d:/testPolicy.txt赋予读写的权限

倒数第三行:grant codeBase "file:D:/workspace/TestPolicy/bin/*" 这一句我们笔记九的时候见过,就是对D:/workspace/TestPolicy/bin/*下的所有文件赋予权限。

重点一:到这里我们应该可以知道,策略文件可以给一系列被签名的代码库(“friend”,‘stranger“都是代码库)授权,也可以给一个代码来源(一个具体的路径或者说url就是一个代码来源)授权。

重点二:策略文件不仅可以存储在文件中(后缀名是什么不重要),还可以存放在数据库里。

到了这里我们对策略有一个比较完整的概念了,但是你有没有这么一个疑问,前面我们总说,一个应用程序对应一个策略单例,一个策略单例对应一个策略文件,它到底怎么对应的?下面我们就来探究一下。

在探究之前,我们先引入一个新的概念叫保护域(ProtectionDomain),在笔记三的时候,我们提到过类装载器将class文件load内存的时候会将它放置到一个保护域中,是滴今天我就来说说什么是保护域。

              什么是保护域

当类装载器将类型装入Java虚拟机时,它们将为每个类型指派一个保护域。保护域定义了授予一段特定代码的所有权限。(一个保护域对应策略文件中的一个或多个Grant子句。)装载入Java虚拟机的每一个类型都属于一个且仅属于一个保护域。

类装载器知道它装载的所有类或接口的代码库和签名者。它利用这些信息来创建一个CodeSource对象。它将这个CodeSource对象传递个当前Policy对象的getPermissions()方法,得到这个抽象类java.security.PermissionCollection的子类实例。这个PermissinCollection包含了到所有Permission对象的引用(这些Permission对象由当前策略授予指定代码来源)。利用它创建的CodeSource和它冲Policy对象得到的PermissionCollection,它可以实例化一个新的ProtectDomain对象。它通过将合适的ProtectionDomain对象传递给defineClass()方法,来将这段代码放到一个保护域中

如果你对上面这段话理解不了,看下面这个图

java jvm学习笔记十(策略和保护域)

好了看完上面的这整个过程之后你是否已经理解什么是保护域了。

下面我们再整理一下今天的内容,概念有点多,一个一个的来。

codeSource:代码源,这个是类装载器生成的java.security.CodeSource的一个对象,classLoader通过读取class文件,jar包得知谁为这个类签过名(可以有多个签名者,关于签名请查看笔记七和八)而封装成一个签名者数组赋给codeSource对象的signers成员,通过这个类的来源(可能来自一个本地的url或者一个网络的ur,对应了grant笔记九里myPollicy里的"friend"或者file::....l)赋给codeSource的location成员,还有这个类的公钥证书赋给codeSource的certs成员(通常一个jar是能够被多个团体或者机构担保的,也就是我们说的认证,在java1.2的默认安全管理器还有访问控制体系结构都只能对证书起作用,而不能对赤裸的公钥起作用,而实际上,我们用keytool生成密钥对时,同时会生成一个自签名证书,所以keytool生成的密钥对并不是赤裸的)。如果你有疑问,我们看一下jdk里的代码

Policy:策略,就是用来读取策略文件的一个单例对象,通过传入的CodeSource对象(由于codeSource对象里包含了签名者和代码来源)所以他通过读取grant段,取出一个个的Perssiom然后返回一个PerssiomCollection。这个类里有一个很重要的成员变量

这个成员为什么重要,我们来看一个方法

 

我们主要看关键代码。这个pdMapping就是把保护域对象当做key将权限集合当做value存在在了这个map里。所以我们说一个保护域对应多个策略文件的grant子句的permission。

ProtectionDomain:保护域,前面我们已经介绍过了,他就是用来容纳class文件,还有perssiom,codeSource的一个对象,如果你对此还有什么疑问,我们也看看它的代码,来验证一下我们的结论

Permission:权限,这个对应了我们笔记九里的grant子句里的一个permission,它的结构也很简单,权限名和动作,就好像我们笔记九里的java.io.FilePermission是一个权限名

而动作则是read和write,在Permission中它对应一个字符串。

现在我们用一张图来把上面几个概念串联起来

java jvm学习笔记十(策略和保护域)

到这里我们已经有一条比较完整的思路了,从笔记四到这一节的笔记十,我们所要说的都只有一件事情,类装载器在装载类的时候(或者执行类)会调用安全管理器,安全管理器,则通过判断策略来判断我们是不是允许加载这个类,或者执行某些操作,允许某个文件的读写啊之类的(这个在笔记九的时候我们已经做过实验了)。那么你有没有这样的疑问,到底安全管理器是怎么样去调用策略的?这里我们不得不提出一个新的概念访问控制器AccessControl,如果你想知道访问控制器是干什么的,做什么工作,怎么和安全管理进行合作,那么请你阅读下一节。

java jvm学习笔记十(策略和保护域)的更多相关文章

  1. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

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

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一 ...

  3. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  4. java jvm学习笔记十一(访问控制器)

     欢迎装载请说明出处: http://blog.csdn.net/yfqnihao/article/details/8271665 这一节,我们要学习的是访问控制器,在阅读本节之前,如果没有前面几节的 ...

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

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...

  6. java jvm学习笔记九(策略文件)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271407 课程源码:http://download.csdn.net/detail ...

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

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完 ...

  8. java jvm学习笔记八(实现jar包的代码签名)

     欢迎装载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8267669 课程源码:http://download.csdn.net/detai ...

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

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

随机推荐

  1. Python lambda函数

    python允许定义单行的小函数,定义lambda函数的形式如下: lambda 参数:表达式lambda函数默认返回表达式的值,可接收任意个参数,包括可选参数,但是表达式只有一个.

  2. 虚拟化平台cloudstack(6)——使用maven:jetty调试

    调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 apache ant JDK的配置和安装 安装可以参考: htt ...

  3. Python序列(Sequence)

    Sequence是Python的一种内置类型(built-in type),内置类型就是构建在Python Interpreter里面的类型,三种基本的Sequence Type是list(表),tu ...

  4. 关于safari上的select宽高问题小技,自定义下拉框

    之前一直用windows做开发,最近换了个mac,在几经折腾之下,安装完了各种开发工具,IDE等,然后欣然打开自己正在开发的网站.突然发现mac上所有的下拉框都变了,都是默认样式,无论padding, ...

  5. 如何在node和vue前后端分离的项目中使用极客验证,用node的方式

    1.用express的脚手架和vue-cli的脚手架搭建的项目目录如下图 2.在vue-client的src/component新建一个login.vue文件,作为登录页面,代码如下 <temp ...

  6. 如何利用office绘制施工进度计划横道图?

    在Excel中利用“悬浮的条形图”可以制作简单的横道图.Step1 启动Excel,仿照图1的格式,制作一份表格,并将有关工序名称.开(完)工时间和工程持续时间等数据填入表格中. A1单元格中请不要输 ...

  7. python 读取excel数据并将测试结果填入Excel

    python 读取excel数据并将测试结果填入Excel 读取一个Excel中的一条数据用例,请求接口,然后返回结果并反填到excel中.过程中会生成请求回来的文本,当然还会生成一个xml文件.具体 ...

  8. CF1131D tarjan,拓扑

    题目链接 541div2 http://codeforces.com/contest/1131/problem/D 思路 给出n序列和m序列的相对大小关系 构造出最大值最小的序列 缩点+拓扑 小的向大 ...

  9. 使用rgba设置输入框背景透明

    项目中遇到要求输入框的背景设置透明度,但文字不受影响,如下图 输入框使用input标签 <input ref="searchText" type="search&q ...

  10. core Animation之CAKeyframeAnimation&lpar;关键帧动画&rpar;

    CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSA ...