转自: http://blog.csdn.net/jiaotuwoaini/article/details/70176021

在某一个线程的调用栈中,当 AccessController 的 checkPermission 方法被最近的调用程序(例如 A 类中的方法)调用时,对于程序要求的所有访问权限,ACC 决定是否授权的基本算法如下:
1. 如果调用链中的某个调用程序没有所需的权限,将抛出 AccessControlException;
2. 若是满足以下情况即被授予权限:
a. 调用程序访问另一个有该权限域里程序的方法,并且此方法标记为有访问“特权”;
b. 调用程序所调用(直接或间接)的后续对象都有上述权限。

当然了,Java SDK 给域提供了 doPrivileged 方法,让程序突破当前域权限限制,临时扩大访问权限。

创建一个项目projectX:

  1. public class FileUtil {
  2. // 工程 A 执行文件的路径
  3. private final static String FOLDER_PATH = "C:\\Users\\dushangkui\\workspace\\projectX\\bin";
  4. public static void makeFile(String fileName) {
  5. try {
  6. // 尝试在工程 A 执行文件的路径中创建一个新文件
  7. File fs = new File(FOLDER_PATH + "\\" + fileName);
  8. fs.createNewFile();
  9. } catch (AccessControlException e) {
  10. e.printStackTrace();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. public static void doPrivilegedAction(final String fileName) {
  16. // 用特权访问方式创建文件
  17. AccessController.doPrivileged(new PrivilegedAction<String>() {
  18. @Override
  19. public String run() {
  20. makeFile(fileName);
  21. return null;
  22. }
  23. });
  24. }
  25. }

创建另一个项目projectY

  1. public class DemoDoPrivilege {
  2. public static void main(String[] args) {
  3. System.out.println("***************************************");
  4. System.out.println("I will show AccessControl functionality...");
  5. System.out.println("Preparation step : turn on system permission check...");
  6. // 打开系统安全权限检查开关
  7. System.setSecurityManager(new SecurityManager());
  8. System.out.println();
  9. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  10. System.out.println("Create a new file named temp1.txt via privileged action ...");
  11. // 用特权访问方式在工程 A 执行文件路径中创建 temp1.txt 文件
  12. FileUtil.doPrivilegedAction("temp1.txt");
  13. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  14. System.out.println();
  15. System.out.println("/");
  16. System.out.println("Create a new file named temp2.txt via File ...");
  17. try {
  18. // 用普通文件操作方式在工程 A 执行文件路径中创建 temp2.txt 文件
  19. File fs = new File(
  20. "C:\\Users\\dushangkui\\workspace\\projectX\\temp2.txt");
  21. fs.createNewFile();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } catch (AccessControlException e1) {
  25. e1.printStackTrace();
  26. }
  27. System.out.println("/");
  28. System.out.println();
  29. System.out.println("-----------------------------------------");
  30. System.out.println("create a new file named temp3.txt via FileUtil ...");
  31. // 直接调用普通接口方式在工程 A 执行文件路径中创建 temp3.txt 文件
  32. FileUtil.makeFile("temp3.txt");
  33. System.out.println("-----------------------------------------");
  34. System.out.println();
  35. System.out.println("***************************************");
  36. }
  37. }

在projectY根目录下面创建策略文件MyPolicy.txt

[java]  view plain copy
  1. // 授权工程 A 执行文件路径中文件在本目录中的写文件权限
  2. grant codeBase "file:D:/lianjia/20180130test/-"
    {permission java.io.FilePermission "D:/lianjia/20180130test/-", "write";
    };

配置JVM运行参数 -Djava.security.policy=.\\MyPolicy.txt

-Djava.security.manager   //打开  安全策略

 -Djava.security.policy=.\\MyPolicy.txt  //制定安全侧路位置

Java默认不打开安全检查,如果不打开,本地程序拥有所有权限:

[java]  view plain copy
  1. ***************************************
  2. I will show AccessControl functionality...
  3. Preparation step : turn on system permission check...
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Create a new file named temp1.txt via privileged action ...
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. /
  8. Create a new file named temp2.txt via File ...
  9. /
  10. -----------------------------------------
  11. create a new file named temp3.txt via FileUtil ...
  12. -----------------------------------------
  13. ***************************************

如果添加 运行VM option :

[java]  view plain copy
  1. ***************************************
  2. I will show AccessControl functionality...
  3. Preparation step : turn on system permission check...
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Create a new file named temp1.txt via privileged action ...
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. /
  8. Create a new file named temp2.txt via File ...
  9. java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\temp2.txt" "write")
  10. at java.security.AccessControlContext.checkPermission(Unknown Source)
  11. at java.security.AccessController.checkPermission(Unknown Source)
  12. at java.lang.SecurityManager.checkPermission(Unknown Source)
  13. at java.lang.SecurityManager.checkWrite(Unknown Source)
  14. at java.io.File.createNewFile(Unknown Source)
  15. at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:33)
  16. /
  17. -----------------------------------------
  18. create a new file named temp3.txt via FileUtil ...
  19. java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\bin\temp3.txt" "write")
  20. at java.security.AccessControlContext.checkPermission(Unknown Source)
  21. at java.security.AccessController.checkPermission(Unknown Source)
  22. at java.lang.SecurityManager.checkPermission(Unknown Source)
  23. at java.lang.SecurityManager.checkWrite(Unknown Source)
  24. at java.io.File.createNewFile(Unknown Source)
  25. at com.dusk.FileUtil.makeFile(FileUtil.java:17)
  26. at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:45)
  27. -----------------------------------------
  28. ***************************************

在某一个线程的调用栈中,当 AccessController 的 checkPermission 方法被最近的调用程序(例如 A 类中的方法)调用时,对于程序要求的所有访问权限,ACC 决定是否授权的基本算法如下:
1. 如果调用链中的某个调用程序没有所需的权限,将抛出 AccessControlException;
2. 若是满足以下情况即被授予权限:
a. 调用程序访问另一个有该权限域里程序的方法,并且此方法标记为有访问“特权”;
b. 调用程序所调用(直接或间接)的后续对象都有上述权限。

当然了,Java SDK 给域提供了 doPrivileged 方法,让程序突破当前域权限限制,临时扩大访问权限。

创建一个项目projectX:

[java]  view plain copy
  1. package com.dusk;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.security.AccessControlException;
  5. import java.security.AccessController;
  6. import java.security.PrivilegedAction;
  7. public class FileUtil {
  8. // 工程 A 执行文件的路径
  9. private final static String FOLDER_PATH = "C:\\Users\\dushangkui\\workspace\\projectX\\bin";
  10. public static void makeFile(String fileName) {
  11. try {
  12. // 尝试在工程 A 执行文件的路径中创建一个新文件
  13. File fs = new File(FOLDER_PATH + "\\" + fileName);
  14. fs.createNewFile();
  15. } catch (AccessControlException e) {
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. public static void doPrivilegedAction(final String fileName) {
  22. // 用特权访问方式创建文件
  23. AccessController.doPrivileged(new PrivilegedAction<String>() {
  24. @Override
  25. public String run() {
  26. makeFile(fileName);
  27. return null;
  28. }
  29. });
  30. }
  31. }

创建另一个项目projectY

[java]  view plain copy
  1. package com.dusk;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.security.AccessControlException;
  5. import com.dusk.FileUtil;
  6. public class DemoDoPrivilege {
  7. public static void main(String[] args) {
  8. System.out.println("***************************************");
  9. System.out.println("I will show AccessControl functionality...");
  10. System.out.println("Preparation step : turn on system permission check...");
  11. // 打开系统安全权限检查开关
  12. System.setSecurityManager(new SecurityManager());
  13. System.out.println();
  14. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  15. System.out.println("Create a new file named temp1.txt via privileged action ...");
  16. // 用特权访问方式在工程 A 执行文件路径中创建 temp1.txt 文件
  17. FileUtil.doPrivilegedAction("temp1.txt");
  18. System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
  19. System.out.println();
  20. System.out.println("/");
  21. System.out.println("Create a new file named temp2.txt via File ...");
  22. try {
  23. // 用普通文件操作方式在工程 A 执行文件路径中创建 temp2.txt 文件
  24. File fs = new File(
  25. "C:\\Users\\dushangkui\\workspace\\projectX\\temp2.txt");
  26. fs.createNewFile();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. } catch (AccessControlException e1) {
  30. e1.printStackTrace();
  31. }
  32. System.out.println("/");
  33. System.out.println();
  34. System.out.println("-----------------------------------------");
  35. System.out.println("create a new file named temp3.txt via FileUtil ...");
  36. // 直接调用普通接口方式在工程 A 执行文件路径中创建 temp3.txt 文件
  37. FileUtil.makeFile("temp3.txt");
  38. System.out.println("-----------------------------------------");
  39. System.out.println();
  40. System.out.println("***************************************");
  41. }
  42. }

在projectY根目录下面创建策略文件MyPolicy.txt

[java]  view plain copy
  1. // 授权工程 A 执行文件路径中文件在本目录中的写文件权限
  2. grant codebase "file:C:/Users/dushangkui/workspace/projectX/bin"
  3. {
  4. permission java.io.FilePermission
  5. "C:\\Users\\dushangkui\\workspace\\projectX\\bin\\*", "write";
  6. };

配置JVM运行参数 -Djava.security.policy=.\\MyPolicy.txt

Java默认不打开安全检查,如果不打开,本地程序拥有所有权限:

[java]  view plain copy
  1. ***************************************
  2. I will show AccessControl functionality...
  3. Preparation step : turn on system permission check...
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Create a new file named temp1.txt via privileged action ...
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. /
  8. Create a new file named temp2.txt via File ...
  9. /
  10. -----------------------------------------
  11. create a new file named temp3.txt via FileUtil ...
  12. -----------------------------------------
  13. ***************************************

如果去掉注释:

[java]  view plain copy
  1. ***************************************
  2. I will show AccessControl functionality...
  3. Preparation step : turn on system permission check...
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Create a new file named temp1.txt via privileged action ...
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. /
  8. Create a new file named temp2.txt via File ...
  9. java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\temp2.txt" "write")
  10. at java.security.AccessControlContext.checkPermission(Unknown Source)
  11. at java.security.AccessController.checkPermission(Unknown Source)
  12. at java.lang.SecurityManager.checkPermission(Unknown Source)
  13. at java.lang.SecurityManager.checkWrite(Unknown Source)
  14. at java.io.File.createNewFile(Unknown Source)
  15. at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:33)
  16. /
  17. -----------------------------------------
  18. create a new file named temp3.txt via FileUtil ...
  19. java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\dushangkui\workspace\projectX\bin\temp3.txt" "write")
  20. at java.security.AccessControlContext.checkPermission(Unknown Source)
  21. at java.security.AccessController.checkPermission(Unknown Source)
  22. at java.lang.SecurityManager.checkPermission(Unknown Source)
  23. at java.lang.SecurityManager.checkWrite(Unknown Source)
  24. at java.io.File.createNewFile(Unknown Source)
  25. at com.dusk.FileUtil.makeFile(FileUtil.java:17)
  26. at com.dusk.DemoDoPrivilege.main(DemoDoPrivilege.java:45)
  27. -----------------------------------------
  28. ***************************************

AccessController.doPrivileged相关推荐

  1. java 的 AccessController.doPrivileged使用

    http://huangyunbin.iteye.com/blog/1942509 AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢: ...

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

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

  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. illegalstateexception是什么异常_异常源码分析—告诉你学习“源码”究竟有什么用!...

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

  7. linux的android工作室,Android工作室在启动时抛出错误,linux机器

    我只是将我的Android Studio从1.5升级到2.3,我只是解压缩文件夹并复制到下载文件夹中,现在当我启动android studio时,我收到了此消息:Android工作室在启动时抛出错误, ...

  8. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...

  9. Java中的ClassLoader和SPI机制

    深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...

最新文章

  1. 从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
  2. Win32 OpenGL标准例子
  3. linux cpu softirq,linux softirq机制
  4. maven 国内私服
  5. 【opencv】双目视觉下空间坐标计算/双目测距 6/13更新(转载)
  6. 王道机试指南读后总结-1
  7. Android中ListView动态加载数据
  8. 从零搭建 ES 搜索服务(六)相关性排序优化
  9. JAVA学习笔记 || 使用Point 类的注意事项
  10. 显微镜下的大明内容_《显微镜下的大明》读后感
  11. SYN FLOOD WINCAP
  12. 百度地图-将经纬度转化为地址
  13. 学习笔记——经纬度坐标系及定位相关API
  14. 〖2023·新星计划·第四季〗开启,Python赛道火爆预热中~ 欢迎小伙伴们报名~
  15. 使用vue中的transition标签实现点击缓慢展开,再点缓慢关闭
  16. 用Qemu搭建x86学习环境
  17. IDEA 操作指南 - 演出模式,注入语言编辑器,快速切换,快速定位
  18. H3CIE A套需求说明
  19. wetool个人版_wetool自动接受新好友wetool使用教程-网站
  20. scrapy mysql 词云_利用Scrapy爬取姓名大全作词云分析

热门文章

  1. 读取文件字节流到字节数组,字节数组写入到文件
  2. 对比学习视角重新审视推荐系统
  3. 华为nova8和荣耀v40的区别
  4. 小米小爱音箱Pro8安装app_小米小爱音箱HD:声色俱全的智能音箱
  5. %ld在c语言函数中个的作用,C语言的%ld、%d、%U是啥意思啊?
  6. Discuz 精心整理的搬家教程
  7. MATLAB采用筛选法求质数,C/C++利用筛选法算素数的方法示例
  8. Pyspider实例之抓取小米众筹产品
  9. webgl坐标转换_WebGL笔记_绘制流程以及三维坐标变换(一)
  10. Box2D v2.3.0 用户指南(第四章)