http://huangyunbin.iteye.com/blog/1942509

AccessController.doPrivileged意思是这个是特别的,不用做权限检查.

在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们的类本生是没有权限去读取那个文件的,一般情况下就是眼睁睁的看着了.

但是jiava提供了doPrivileged.在1.jar中如果读取文件的方法是通过doPrivileged来实现的.就不会有后面的检查了,现在我们就可以使用1.jar去读取那个文件了.

例子:

Java代码

package huangyunbin.client;
import java.io.FilePermission;
import java.security.AccessController;
import java.security.Permission;
import java.security.PrivilegedAction;
public class Client
{
public   void  doCheck() {
AccessController.doPrivileged( new  PrivilegedAction()  {
public  Object run()  {
check();
return   null ;
}
} );
}
private   void  check()  {
Permission perm  =   new FilePermission( "/1.txt" ,  "read" );
AccessController.checkPermission(perm);
System.out.println( " TestService has permission " );
}
}

把这个类打包成client.jar 放到/home/h/client/下
我们建立个my.policy文件,文件内容是:

Java代码

grant codeBase  "file:/home/h/client/*"   {
permission java.io.FilePermission  "/1.txt","read";
};

配置文件的意思是 /home/h/client/下面的jar包或class类 可以读取/1.txt.

现在我们再创建一个项目:创建一个类来调用前面的Client

Java代码

public class server
{
public static void main(String[] args)
{
Client c =new    Client();
c.doCheck();
}
}

运行这个server类.注意这里要用上之前的my.policy文件
在vm参数中写上这样的:

Java代码

-Djava.security.manager
-Djava.security.policy=/home/h/my.policy

运行,结果是
TestService has permission

在配置文件my.policy中我们没有允许server去读取/1.txt,但是现在却可以正常访问.这个就是 AccessController.doPrivileged的作用.

===http://www.blogjava.net/Phrancol/articles/259069.html

java.policy

grant codeBase "file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*" {
    permission java.io.FilePermission "c:/TestService-1.0.jar", "read";
    permission java.lang.RuntimePermission "createClassLoader";
};

grant codeBase "file:/c:/TestService-1.0.jar" {
    permission java.io.FilePermission "C:/text.txt", "read";
};

Project - ServiceCentre

package test;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/** *//**
 * @author Donf Yang
 */
public class ServiceCentreMain {

    public void loadService() {
        URL[] urls;
        try {
            urls = new URL[] { new URL("file:c:/TestService-1.0.jar") };
            URLClassLoader ll = new URLClassLoader(urls);
            final Class a = ll.loadClass("test.TestService");
            Object o = a.newInstance();
            Method m = a.getMethod("doService", null);
            m.invoke(o, null);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /** *//**
     * @param args
     */
    public static void main(String[] args) {
        ServiceCentreMain s = new ServiceCentreMain();
        s.loadService();
    }

}

Project - TestService
将TestService打包,放到C盘

package test;

import java.io.FilePermission;
import java.security.AccessController;
import java.security.Permission;

/** *//**
 * @author Donf Yang
 * 
 */
public class TestService {

    public void doService() {
        
        doFileOperation();

    }

    private void doFileOperation() {
        Permission perm = new FilePermission("C:/text.txt", "read");
        AccessController.checkPermission(perm);
        System.out.println("TestService has permission");
    }

}

运行这个例子的时候,会出现权限错误,把doService()修改一下,就可以顺利通过

public void doService() {

        // doFileOperation();

        AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                doFileOperation();
                return null;
            }
        });
    }

在这个例子中AccessControlContext的stack顺序为
2.  file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*
1 . file:/c:/TestService-1.0.jar

2没有权限,1有权限,使用doPrivileged后,不检查2

看一下java.security.AccessController的JavaDoc:

A caller can be marked as being "privileged" (see doPrivileged and below). When making access control decisions, the checkPermission method stops checking if it reaches a caller that was marked as "privileged" via a doPrivileged call without a context argument (see below for information about a context argument). If that caller's domain has the specified permission, no further checking is done and checkPermission returns quietly, indicating that the requested access is allowed. If that domain does not have the specified permission, an exception is thrown, as usual. 

其中提到的no further checking is done的意思是指stack中的checking

加入一个TestService2,文件操作在1,stack为(1,2,3为checking顺序)
3 . file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*
2 . file:/c:/TestService-1.0.jar
1.  file:/c:/TestService2-1.0.jar
 checking顺序为  1->2->3
如果doPrivileged是在2中调用,那么1,2需要具有权限,3不再进行检查
如果doPrivileged是在1中调用,那么1需要具有权限,2,3不再进行检查

总结:
1.  这里容易理解错误的地方是checking顺序,例如一个调用链 MethodA->MethodB->MethodC(这里的3个方法需要在3个不同的ProtectionDomain中),doPrivileged在MethodB中,很容易理解成检查A,B而不检查C,实际上stack中检查顺序为C->B->A,也就是检查C,B而不检查A

2. ServiceCentre不需要太多权限,而Service就需要使用doPrivileged来避免受到ServiceCentre的权限限制(如果service有足够的权限),Equinox中有很多这样的例子(Equinox扮演Service的角色)。

java 的 AccessController.doPrivileged使用相关推荐

  1. java doprivileged_【转】关于AccessController.doPrivileged

    在查看socket源码时发现在getInputStream()这个方法里有这种写法,之前没有遇到过,做个记录. 搬运自这里; 最近在看一些框架代码,偶尔都会遇到AccessController.doP ...

  2. AccessController.doPrivileged

    转自: http://blog.csdn.net/jiaotuwoaini/article/details/70176021 在某一个线程的调用栈中,当 AccessController 的 chec ...

  3. jvm之AccessController.doPrivileged

    AccessController.doPrivileged在底层源码中会出现,本文对它进行一个简单介绍及如何使用的说明. 首先解释一下几个相关概念 保护域 类被装入jvm,为每个类指定一个保护域,保护 ...

  4. HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析

    最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用 实现代码如下: public stati ...

  5. java编程 linux_Linux下java编程

    一.如何编译程序 1.mkdir hello,cd hello vi HelloWorld.java public class HelloWorld{ public static void main( ...

  6. java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案

    问题描述 在部署一个验证码服务的容器服务时遇到了一个空指针错误,错误代码为: java.lang.NullPointerException at sun.awt.FontConfiguration.g ...

  7. java运行出现JNI错误,JDK8和JDK11都安装了

    java运行出现JNI错误,JDK8和JDK11都安装了 1. 问题描述 2. 尝试办法 3. 解决办法 3.1 解决方法: 3.2 测试结果成功 1. 问题描述 因为编程的需要,所以我安装了JDK8 ...

  8. Java mission control 飞行记录器开启失败

    2019独角兽企业重金招聘Python工程师标准>>> Java Mission Controll开启飞行记录器出错: java.lang.RuntimeException: Acc ...

  9. hivemetastore java,hive启动报错 hive.metastore.HiveMetaStoreClient

    之前用的是hive-0.90 ,想与hbase整合下,所以更换hive为0.13.1版本,因为偷懒将原来的conf配置文件拷贝, 结果出现如下错误,hive.metastore.local,hive. ...

最新文章

  1. HTML5 利用canvas API 展示阴影效果
  2. svn的一些相关资料
  3. MAC OS X10.10+ python3.6 + tensorflow1.3.0
  4. python 基础教程:字符串内建函数之大小写的区别
  5. SAP Spartacus使用到的技术栈
  6. [react] React中你有使用过propType吗?它有什么作用?
  7. Android中实时视频传输(摄像头实时视频传输)解决方案二
  8. Java讲课笔记10:类的封装
  9. 全面提升AI语言理解能力,达摩院自研语言模型体系登顶6大权威榜单
  10. access游戏库不显示 ea_全球游戏公司营收一览:腾讯连续第六年霸榜
  11. GOF23设计模式之单例模式
  12. 计算机网络和lnternet的课件,Computer Networks and Internets《计算机网络与因特网》课件.ppt...
  13. Python3的迭代器
  14. ArcMAP 用不同颜色区分地类
  15. DSP31段调音教程及调音MP3
  16. 大一计算机专业学生自我月小结,大学生学习过程月度总结
  17. Ubuntu交叉编译U-boot
  18. 5. Java数组、排序和查找
  19. 如何搭建EOS主网节点?
  20. svn 认证失败请看解决办法

热门文章

  1. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
  2. App设计灵感之十二组精美的音乐播放器App设计案例
  3. 电商三巨头交成绩单,这次拼多多输了吗?
  4. HTML 限制 input 输入类型
  5. 数数塔 NBUT - 1083
  6. 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法
  7. 【Java12】tomcatservlet(nginx,web.xml,生命周期,适配器优化),requestresponse(请求转发,登陆案例(1),重定向,文件下载)
  8. 【机器视觉】机器视觉博客汇总
  9. hive 分区_代码 | Spark读取mongoDB数据写入Hive普通表和分区表
  10. MySQL的查询缓存