AccessController.doPrivileged
转自: http://blog.csdn.net/jiaotuwoaini/article/details/70176021
在某一个线程的调用栈中,当 AccessController 的 checkPermission 方法被最近的调用程序(例如 A 类中的方法)调用时,对于程序要求的所有访问权限,ACC 决定是否授权的基本算法如下:
1. 如果调用链中的某个调用程序没有所需的权限,将抛出 AccessControlException;
2. 若是满足以下情况即被授予权限:
a. 调用程序访问另一个有该权限域里程序的方法,并且此方法标记为有访问“特权”;
b. 调用程序所调用(直接或间接)的后续对象都有上述权限。
当然了,Java SDK 给域提供了 doPrivileged 方法,让程序突破当前域权限限制,临时扩大访问权限。
创建一个项目projectX:
- public class FileUtil {
- // 工程 A 执行文件的路径
- private final static String FOLDER_PATH = "C:\\Users\\dushangkui\\workspace\\projectX\\bin";
- public static void makeFile(String fileName) {
- try {
- // 尝试在工程 A 执行文件的路径中创建一个新文件
- File fs = new File(FOLDER_PATH + "\\" + fileName);
- fs.createNewFile();
- } catch (AccessControlException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void doPrivilegedAction(final String fileName) {
- // 用特权访问方式创建文件
- AccessController.doPrivileged(new PrivilegedAction<String>() {
- @Override
- public String run() {
- makeFile(fileName);
- return null;
- }
- });
- }
- }
创建另一个项目projectY
- public class DemoDoPrivilege {
- public static void main(String[] args) {
- System.out.println("***************************************");
- System.out.println("I will show AccessControl functionality...");
- System.out.println("Preparation step : turn on system permission check...");
- // 打开系统安全权限检查开关
- System.setSecurityManager(new SecurityManager());
- System.out.println();
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println("Create a new file named temp1.txt via privileged action ...");
- // 用特权访问方式在工程 A 执行文件路径中创建 temp1.txt 文件
- FileUtil.doPrivilegedAction("temp1.txt");
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println();
- System.out.println("/");
- System.out.println("Create a new file named temp2.txt via File ...");
- try {
- // 用普通文件操作方式在工程 A 执行文件路径中创建 temp2.txt 文件
- File fs = new File(
- "C:\\Users\\dushangkui\\workspace\\projectX\\temp2.txt");
- fs.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (AccessControlException e1) {
- e1.printStackTrace();
- }
- System.out.println("/");
- System.out.println();
- System.out.println("-----------------------------------------");
- System.out.println("create a new file named temp3.txt via FileUtil ...");
- // 直接调用普通接口方式在工程 A 执行文件路径中创建 temp3.txt 文件
- FileUtil.makeFile("temp3.txt");
- System.out.println("-----------------------------------------");
- System.out.println();
- System.out.println("***************************************");
- }
- }
在projectY根目录下面创建策略文件MyPolicy.txt
- // 授权工程 A 执行文件路径中文件在本目录中的写文件权限
grant codeBase "file:D:/lianjia/20180130test/-" {permission java.io.FilePermission "D:/lianjia/20180130test/-", "write"; };
配置JVM运行参数 -Djava.security.policy=.\\MyPolicy.txt
-Djava.security.manager //打开 安全策略
Java默认不打开安全检查,如果不打开,本地程序拥有所有权限:
- ***************************************
- I will show AccessControl functionality...
- Preparation step : turn on system permission check...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create a new file named temp1.txt via privileged action ...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /
- Create a new file named temp2.txt via File ...
- /
- -----------------------------------------
- create a new file named temp3.txt via FileUtil ...
- -----------------------------------------
- ***************************************
如果添加 运行VM option :
- ***************************************
- I will show AccessControl functionality...
- Preparation step : turn on system permission check...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create a new file named temp1.txt via privileged action ...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /
- Create a new file named temp2.txt via File ...
- java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\temp2.txt" "write")
- at java.security.AccessControlContext.checkPermission(Unknown Source)
- at java.security.AccessController.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkWrite(Unknown Source)
- at java.io.File.createNewFile(Unknown Source)
- at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:33)
- /
- -----------------------------------------
- create a new file named temp3.txt via FileUtil ...
- java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\bin\temp3.txt" "write")
- at java.security.AccessControlContext.checkPermission(Unknown Source)
- at java.security.AccessController.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkWrite(Unknown Source)
- at java.io.File.createNewFile(Unknown Source)
- at com.dusk.FileUtil.makeFile(FileUtil.java:17)
- at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:45)
- -----------------------------------------
- ***************************************
在某一个线程的调用栈中,当 AccessController 的 checkPermission 方法被最近的调用程序(例如 A 类中的方法)调用时,对于程序要求的所有访问权限,ACC 决定是否授权的基本算法如下:
1. 如果调用链中的某个调用程序没有所需的权限,将抛出 AccessControlException;
2. 若是满足以下情况即被授予权限:
a. 调用程序访问另一个有该权限域里程序的方法,并且此方法标记为有访问“特权”;
b. 调用程序所调用(直接或间接)的后续对象都有上述权限。
当然了,Java SDK 给域提供了 doPrivileged 方法,让程序突破当前域权限限制,临时扩大访问权限。
创建一个项目projectX:
- package com.dusk;
- import java.io.File;
- import java.io.IOException;
- import java.security.AccessControlException;
- import java.security.AccessController;
- import java.security.PrivilegedAction;
- public class FileUtil {
- // 工程 A 执行文件的路径
- private final static String FOLDER_PATH = "C:\\Users\\dushangkui\\workspace\\projectX\\bin";
- public static void makeFile(String fileName) {
- try {
- // 尝试在工程 A 执行文件的路径中创建一个新文件
- File fs = new File(FOLDER_PATH + "\\" + fileName);
- fs.createNewFile();
- } catch (AccessControlException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void doPrivilegedAction(final String fileName) {
- // 用特权访问方式创建文件
- AccessController.doPrivileged(new PrivilegedAction<String>() {
- @Override
- public String run() {
- makeFile(fileName);
- return null;
- }
- });
- }
- }
创建另一个项目projectY
- package com.dusk;
- import java.io.File;
- import java.io.IOException;
- import java.security.AccessControlException;
- import com.dusk.FileUtil;
- public class DemoDoPrivilege {
- public static void main(String[] args) {
- System.out.println("***************************************");
- System.out.println("I will show AccessControl functionality...");
- System.out.println("Preparation step : turn on system permission check...");
- // 打开系统安全权限检查开关
- System.setSecurityManager(new SecurityManager());
- System.out.println();
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println("Create a new file named temp1.txt via privileged action ...");
- // 用特权访问方式在工程 A 执行文件路径中创建 temp1.txt 文件
- FileUtil.doPrivilegedAction("temp1.txt");
- System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
- System.out.println();
- System.out.println("/");
- System.out.println("Create a new file named temp2.txt via File ...");
- try {
- // 用普通文件操作方式在工程 A 执行文件路径中创建 temp2.txt 文件
- File fs = new File(
- "C:\\Users\\dushangkui\\workspace\\projectX\\temp2.txt");
- fs.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (AccessControlException e1) {
- e1.printStackTrace();
- }
- System.out.println("/");
- System.out.println();
- System.out.println("-----------------------------------------");
- System.out.println("create a new file named temp3.txt via FileUtil ...");
- // 直接调用普通接口方式在工程 A 执行文件路径中创建 temp3.txt 文件
- FileUtil.makeFile("temp3.txt");
- System.out.println("-----------------------------------------");
- System.out.println();
- System.out.println("***************************************");
- }
- }
在projectY根目录下面创建策略文件MyPolicy.txt
- // 授权工程 A 执行文件路径中文件在本目录中的写文件权限
- grant codebase "file:C:/Users/dushangkui/workspace/projectX/bin"
- {
- permission java.io.FilePermission
- "C:\\Users\\dushangkui\\workspace\\projectX\\bin\\*", "write";
- };
配置JVM运行参数 -Djava.security.policy=.\\MyPolicy.txt
Java默认不打开安全检查,如果不打开,本地程序拥有所有权限:
- ***************************************
- I will show AccessControl functionality...
- Preparation step : turn on system permission check...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create a new file named temp1.txt via privileged action ...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /
- Create a new file named temp2.txt via File ...
- /
- -----------------------------------------
- create a new file named temp3.txt via FileUtil ...
- -----------------------------------------
- ***************************************
如果去掉注释:
- ***************************************
- I will show AccessControl functionality...
- Preparation step : turn on system permission check...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create a new file named temp1.txt via privileged action ...
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /
- Create a new file named temp2.txt via File ...
- java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\temp2.txt" "write")
- at java.security.AccessControlContext.checkPermission(Unknown Source)
- at java.security.AccessController.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkWrite(Unknown Source)
- at java.io.File.createNewFile(Unknown Source)
- at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:33)
- /
- -----------------------------------------
- create a new file named temp3.txt via FileUtil ...
- java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\bin\temp3.txt" "write")
- at java.security.AccessControlContext.checkPermission(Unknown Source)
- at java.security.AccessController.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkPermission(Unknown Source)
- at java.lang.SecurityManager.checkWrite(Unknown Source)
- at java.io.File.createNewFile(Unknown Source)
- at com.dusk.FileUtil.makeFile(FileUtil.java:17)
- at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:45)
- -----------------------------------------
- ***************************************
AccessController.doPrivileged相关推荐
- java 的 AccessController.doPrivileged使用
http://huangyunbin.iteye.com/blog/1942509 AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢: ...
- java doprivileged_【转】关于AccessController.doPrivileged
在查看socket源码时发现在getInputStream()这个方法里有这种写法,之前没有遇到过,做个记录. 搬运自这里; 最近在看一些框架代码,偶尔都会遇到AccessController.doP ...
- 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( ...
- illegalstateexception是什么异常_异常源码分析—告诉你学习“源码”究竟有什么用!...
点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...
- linux的android工作室,Android工作室在启动时抛出错误,linux机器
我只是将我的Android Studio从1.5升级到2.3,我只是解压缩文件夹并复制到下载文件夹中,现在当我启动android studio时,我收到了此消息:Android工作室在启动时抛出错误, ...
- java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...
- Java中的ClassLoader和SPI机制
深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...
最新文章
- 从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
- Win32 OpenGL标准例子
- linux cpu softirq,linux softirq机制
- maven 国内私服
- 【opencv】双目视觉下空间坐标计算/双目测距 6/13更新(转载)
- 王道机试指南读后总结-1
- Android中ListView动态加载数据
- 从零搭建 ES 搜索服务(六)相关性排序优化
- JAVA学习笔记 || 使用Point 类的注意事项
- 显微镜下的大明内容_《显微镜下的大明》读后感
- SYN FLOOD WINCAP
- 百度地图-将经纬度转化为地址
- 学习笔记——经纬度坐标系及定位相关API
- 〖2023·新星计划·第四季〗开启,Python赛道火爆预热中~ 欢迎小伙伴们报名~
- 使用vue中的transition标签实现点击缓慢展开,再点缓慢关闭
- 用Qemu搭建x86学习环境
- IDEA 操作指南 - 演出模式,注入语言编辑器,快速切换,快速定位
- H3CIE A套需求说明
- wetool个人版_wetool自动接受新好友wetool使用教程-网站
- scrapy mysql 词云_利用Scrapy爬取姓名大全作词云分析
热门文章
- 读取文件字节流到字节数组,字节数组写入到文件
- 对比学习视角重新审视推荐系统
- 华为nova8和荣耀v40的区别
- 小米小爱音箱Pro8安装app_小米小爱音箱HD:声色俱全的智能音箱
- %ld在c语言函数中个的作用,C语言的%ld、%d、%U是啥意思啊?
- Discuz 精心整理的搬家教程
- MATLAB采用筛选法求质数,C/C++利用筛选法算素数的方法示例
- Pyspider实例之抓取小米众筹产品
- webgl坐标转换_WebGL笔记_绘制流程以及三维坐标变换(一)
- Box2D v2.3.0 用户指南(第四章)