java AccessController.doPrivileged使用

Coding-lover發表於2016-12-15

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://huangyunbin.iteye.com/blog/1942509

相關文章