java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器)
前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器。
安全管理器是一个单独的对象,在java虚拟机中,它在访问控制-对于外部资源的访问控制-起到中枢作用
如果光看概念可能并不能很好的理解,或者说比较抽象,下面是ClassLoader其中的一个构造函数,先简单的看看它在初始化ClassLoader之前会做一些什么操作
- protected ClassLoader(ClassLoader parent) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkCreateClassLoader();
- }
- this.parent = parent;
- initialized = true;
- }
这个构造函数的第一话(当然还有隐式调用)就是System.getSecurityManager();这行代码返回的就是一个安全管理器对象security,这个对象所属的目录为java.lang.SecurityManager。
这个构造函数先判断如果已经安装了安全管理器security(在前面类装载器的章节,我们提到过,类装载器和安全管理器是可以由用户定制的,
在这里有了体现吧!!既然有System.getSecurityManager();你当然也应该猜到有
System.setSecurityManager();),也就是安全管理器不为空,那么就执行校验,跳到
checkCreateClassLoader();看看他做的是什么操作
- public void checkCreateClassLoader() {
- heckPermission(SecurityConstants.CREATE_CLASSLOADER_PERMISSION);
- }
这里又调用了另外一个方法,从方法名字上,就可以猜到这个方法是用来校验权限的,校验是否有创建ClassLoader的权限,再跳到checkPermisson方法里
- public static void checkPermission(Permission perm)
- throws AccessControlException
- {
- //System.err.println("checkPermission "+perm);
- //Thread.currentThread().dumpStack(); if (perm == null) {
- throw new NullPointerException("permission can't be null");
- } AccessControlContext stack = getStackAccessControlContext();
- // if context is null, we had privileged system code on the stack.
- if (stack == null) {
- Debug debug = AccessControlContext.getDebug();
- boolean dumpDebug = false;
- if (debug != null) {
- dumpDebug = !Debug.isOn("codebase=");
- dumpDebug &= !Debug.isOn("permission=") ||
- Debug.isOn("permission=" + perm.getClass().getCanonicalName());
- } if (dumpDebug && Debug.isOn("stack")) {
- Thread.currentThread().dumpStack();
- } if (dumpDebug && Debug.isOn("domain")) {
- debug.println("domain (context is null)");
- } if (dumpDebug) {
- debug.println("access allowed "+perm);
- }
- return;
- } AccessControlContext acc = stack.optimize();
- acc.checkPermission(perm);
- }
- }
上面的这个方法有些代码比较难以理解,我们不用每行都读懂(这个方法涉及的东西比较多,它涉及到了代码签名认证,策略还有保护域,这些我们在后一节中会详细的讲解,看不懂先跳过),
看它的注解// if context is null, we had privileged system code on the
stack.意思就是如果当前的访问控制器上下文为空,在栈上的系统代码将得到特权,找到acc.checkPermission(perm);再跳进去
找到下面这段代码
- /*
- * iterate through the ProtectionDomains in the context.
- * Stop at the first one that doesn't allow the
- * requested permission (throwing an exception).
- *
- */ /* if ctxt is null, all we had on the stack were system domains,
- or the first domain was a Privileged system domain. This
- is to make the common case for system code very fast */ if (context == null)
- return; for (int i=0; i< context.length; i++) {
- if (context[i] != null && !context[i].implies(perm)) {
- if (dumpDebug) {
- debug.println("access denied " + perm);
- } if (Debug.isOn("failure") && debug != null) {
- // Want to make sure this is always displayed for failure,
- // but do not want to display again if already displayed
- // above.
- if (!dumpDebug) {
- debug.println("access denied " + perm);
- }
- Thread.currentThread().dumpStack();
- final ProtectionDomain pd = context[i];
- final Debug db = debug;
- AccessController.doPrivileged (new PrivilegedAction() {
- public Object run() {
- db.println("domain that failed "+pd);
- return null;
- }
- });
- }
- throw new AccessControlException("access denied "+perm, perm);
- }
- }
什么都不用看,就看最上面的那段注解,意思是遍历上下文中的保护域,一旦发现请求的权限不被允许,停止,抛出异常,到这里我们有一个比较清晰的概念了,安全管理器就是用来控制执行权限的,而上面的这段代码中有一个很重要的类 AccessController,访问控制器,还有一个很重要的名词保护域(保护域我们在前面一节也有简单的带过一下,是不是有点印象),这些可能现在听有点模糊,不要担心,暂时不要管,后面一章节慢慢的会对他们进行讲解。
好了了解安全管理器是做什么的之后,接下来,来做一个下的实验,先来验证,默认安全管理是没
有被安装的,接着来试着把他安装上去。在我的环境中我是没有安装默认的安全管理器的,也没有基于默认的安全管理器写自己的安全管理器,如果需要打开的话,
可以在程序显示的安装安全管理器,同样可以让它自动安装默认的安全管理器(给jvm加上-Djava.security.manager就可以了。
下面我们用熟悉的ecplise写一个简单的demo来看看安装前后的区别,在下一节中,会详细的来学习代码签名认证和策略,并写一个自己的安全管理器。
- <span style="font-size:14px;"> public static void main(String[] args) {
- System.out.println(System.getSecurityManager());
- }</span>
运行这个main函数,输出什么?是的输出null,这个时候我们没有安装默认的安全管理器
重新换个方式运行,在ecplise里右键--Run As--Run Configuration--Arguments,在VM arguments的栏目里输入
-Djava.security.manager。在点击Run,这个时候看到什么?
输出:securityManager的对象名。这个时候默认的安全管理器就被安装上了。
总结:
在java虚拟机中,它在访问控制-对于外部资源的访问控制-起到中枢作用
java之jvm学习笔记四(安全管理器)的更多相关文章
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一
Grabage Collection GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- java jvm学习笔记四(安全管理器)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一 ...
- java之jvm学习笔记六(实践写自己的安全管理器)
安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...
随机推荐
- 基于visual Studio2013解决C语言竞赛题之1050矩阵反斜线求和
题目 解决代码及点评 /************************************************************************/ /* 50 ...
- CSS中怎么让DIV居中(转载)
CSS 如何使DIV层水平居中 今天用CSS碰到个很棘手的问题,DIV本身没有定义自己居中的属性, 网上很多的方法都是介绍用上级的text-align: center然后嵌套一层DIV来解决问题. 可 ...
- 改变Emacs下的注释代码方式以支持当前行(未选中情况下)的注释/反注释
Emacs下支持多行代码的注释/反注释,命令是comment-or-uncomment-region. 我喜欢把它绑定在快捷键C-c C-/上,如下: (global-set-key [?\C-c ? ...
- Ubuntu 14.04LTS Gnome GUI初体验及163更新源配制
Ubuntu 14.04 LTS于前天(2014.4.17)公布, 我今天将我的系统升级到最新, 体验了下最新的UI系统. 我选择了Ubuntu Gnome 的GUI界面.我曾经的系统是12.04lt ...
- Linear Regression(线性回归)(一)—LMS algorithm
(整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 1.问题的引出 先从一个简单的例子说起吧,房地产公司有一些关于Po ...
- WordPress数据备份
服务器钱用光了要关了或者是服务器想要搬家,需要备份各种数据. 今天简单的备份了一下在服务器上面wordpress各种文件和资源. wordpress的数据主要分两个部分,一个是文字部分的:一个是附件部 ...
- ADS1.2安装
一.ADS1.2的安装 1. 解压 2. 双击打开ads1.2 3.我们选择当中的SETUP.EXE文件,进行安装 4.点击Next: 5.这是许可文件,假设允许的话选择Yes: 6.选择安装文件夹, ...
- 28.uva 10891 Game of Sum 记忆化dp
这题和上次的通化邀请赛的那题一样,而且还是简化版本... 那题的题解 请戳这里 ... #include<cstdio> #include<algorithm> #i ...
- 《C++语言基础》实践參考——数组作数据成员
返回:贺老师课程教学链接 [项目5 - 数组作数据成员]阅读教材P255例8.4.注意到类中的数据成员能够是数组.设计一个工资类(Salary),当中类的数据成员例如以下: class Salary ...
- android原生browser分析(一)--Application
类Browser.java是整个应用的Application.其代码例如以下: public class Browser extends Application { @Override public ...