java 的 AccessController.doPrivileged使用

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

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

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

例子:

Java代码  收藏代码
  1. package huangyunbin.client;  
  2.   
  3. import java.io.FilePermission;  
  4. import java.security.AccessController;  
  5. import java.security.Permission;  
  6. import java.security.PrivilegedAction;  
  7.   
  8. public class Client  
  9. {  
  10.     public   void  doCheck() {  
  11.                 AccessController.doPrivileged( new  PrivilegedAction()  {  
  12.             public  Object run()  {  
  13.                 check();  
  14.                 return   null ;  
  15.             }  
  16.         } );  
  17.     }  
  18.   
  19.     private   void  check()  {  
  20.         Permission perm  =   new FilePermission( "/1.txt" ,  "read" );  
  21.         AccessController.checkPermission(perm);  
  22.         System.out.println( " TestService has permission " );  
  23.     }  
  24. }  



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

Java代码  收藏代码
  1. grant codeBase  "file:/home/h/client/*"   {  
  2.      permission java.io.FilePermission  "/1.txt","read";  
  3.  };  



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


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

Java代码  收藏代码
  1. public class server  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Client c =new    Client();  
  6.         c.doCheck();  
  7.     }  
  8. }  



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

Java代码  收藏代码
  1. -Djava.security.manager   
  2. -Djava.security.policy=/home/h/my.policy  



运行,结果是
TestService has permission

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

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

推荐文章:Java 安全模型介绍

原文地址:https://www.cnblogs.com/langtianya/p/5133633.html