java 的 AccessController.doPrivileged使用
http://huangyunbin.iteye.com/blog/1942509
AccessController.doPrivileged意思是这个是特别的,不用做权限检查.
在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们的类本生是没有权限去读取那个文件的,一般情况下就是眼睁睁的看着了.
但是jiava提供了doPrivileged.在1.jar中如果读取文件的方法是通过doPrivileged来实现的.就不会有后面的检查了,现在我们就可以使用1.jar去读取那个文件了.
例子:
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文件,文件内容是:
grant codeBase "file:/home/h/client/*" {
permission java.io.FilePermission "/1.txt","read";
};
配置文件的意思是 /home/h/client/下面的jar包或class类 可以读取/1.txt.
现在我们再创建一个项目:创建一个类来调用前面的Client
public class server
{
public static void main(String[] args)
{
Client c =new Client();
c.doCheck();
}
}
运行这个server类.注意这里要用上之前的my.policy文件
在vm参数中写上这样的:
-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
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
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盘
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()修改一下,就可以顺利通过
// 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:
其中提到的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使用相关推荐
- java doprivileged_【转】关于AccessController.doPrivileged
在查看socket源码时发现在getInputStream()这个方法里有这种写法,之前没有遇到过,做个记录. 搬运自这里; 最近在看一些框架代码,偶尔都会遇到AccessController.doP ...
- AccessController.doPrivileged
转自: http://blog.csdn.net/jiaotuwoaini/article/details/70176021 在某一个线程的调用栈中,当 AccessController 的 chec ...
- jvm之AccessController.doPrivileged
AccessController.doPrivileged在底层源码中会出现,本文对它进行一个简单介绍及如何使用的说明. 首先解释一下几个相关概念 保护域 类被装入jvm,为每个类指定一个保护域,保护 ...
- HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用 实现代码如下: public stati ...
- java编程 linux_Linux下java编程
一.如何编译程序 1.mkdir hello,cd hello vi HelloWorld.java public class HelloWorld{ public static void main( ...
- java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案
问题描述 在部署一个验证码服务的容器服务时遇到了一个空指针错误,错误代码为: java.lang.NullPointerException at sun.awt.FontConfiguration.g ...
- java运行出现JNI错误,JDK8和JDK11都安装了
java运行出现JNI错误,JDK8和JDK11都安装了 1. 问题描述 2. 尝试办法 3. 解决办法 3.1 解决方法: 3.2 测试结果成功 1. 问题描述 因为编程的需要,所以我安装了JDK8 ...
- Java mission control 飞行记录器开启失败
2019独角兽企业重金招聘Python工程师标准>>> Java Mission Controll开启飞行记录器出错: java.lang.RuntimeException: Acc ...
- hivemetastore java,hive启动报错 hive.metastore.HiveMetaStoreClient
之前用的是hive-0.90 ,想与hbase整合下,所以更换hive为0.13.1版本,因为偷懒将原来的conf配置文件拷贝, 结果出现如下错误,hive.metastore.local,hive. ...
最新文章
- HTML5 利用canvas API 展示阴影效果
- svn的一些相关资料
- MAC OS X10.10+ python3.6 + tensorflow1.3.0
- python 基础教程:字符串内建函数之大小写的区别
- SAP Spartacus使用到的技术栈
- [react] React中你有使用过propType吗?它有什么作用?
- Android中实时视频传输(摄像头实时视频传输)解决方案二
- Java讲课笔记10:类的封装
- 全面提升AI语言理解能力,达摩院自研语言模型体系登顶6大权威榜单
- access游戏库不显示 ea_全球游戏公司营收一览:腾讯连续第六年霸榜
- GOF23设计模式之单例模式
- 计算机网络和lnternet的课件,Computer Networks and Internets《计算机网络与因特网》课件.ppt...
- Python3的迭代器
- ArcMAP 用不同颜色区分地类
- DSP31段调音教程及调音MP3
- 大一计算机专业学生自我月小结,大学生学习过程月度总结
- Ubuntu交叉编译U-boot
- 5. Java数组、排序和查找
- 如何搭建EOS主网节点?
- svn 认证失败请看解决办法
热门文章
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
- App设计灵感之十二组精美的音乐播放器App设计案例
- 电商三巨头交成绩单,这次拼多多输了吗?
- HTML 限制 input 输入类型
- 数数塔 NBUT - 1083
- 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法
- 【Java12】tomcatservlet(nginx,web.xml,生命周期,适配器优化),requestresponse(请求转发,登陆案例(1),重定向,文件下载)
- 【机器视觉】机器视觉博客汇总
- hive 分区_代码 | Spark读取mongoDB数据写入Hive普通表和分区表
- MySQL的查询缓存