<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 1  文章 - 37  trackbacks - 0
    <2012年12月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    test

    搜索

    •  

    最新評論

    示例中需要在eclipse中創建2個project:ServiceCentre和TestService

    java.policy

    grant codeBase "file:/D:/Workspaces/ExchangeConnect_V2_Trunk_Maven_workspace/ServiceCentre/bin/*" {
        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

    package test;

    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盤
    package test;

    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()修改一下,就可以順利通過
    public void 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:

    A caller can be marked as being "privileged" (see doPrivileged and below). When making access control decisions, the checkPermission method stops checking if it reaches a caller that was marked as "privileged" via a doPrivileged call without a context argument (see below for information about a context argument). If that caller's domain has the specified permission, no further checking is done and checkPermission returns quietly, indicating that the requested access is allowed. If that domain does not have the specified permission, an exception is thrown, as usual. 

    其中提到的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的角色)。
    posted on 2009-03-11 12:44 Phrancol Yang 閱讀(6747) 評論(1)  編輯  收藏

    FeedBack:
    # re: [原]一個例子理解AccessController.doPrivileged() 2012-12-24 16:19 Flexin
    謝謝分享,我第一遍沒看懂,后來去其他地方看了有關權限檢查的的文章以后才看懂,建議解釋一下調用棧,和權限檢查(取調用棧中權限的交集)。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 青青草国产免费久久久下载| 日韩视频免费在线观看| 免费黄网在线观看| 亚洲午夜理论片在线观看| 很黄很黄的网站免费的| 亚洲国产成人久久精品app| 亚洲电影免费观看| 中文字幕无码精品亚洲资源网久久 | 亚洲1区2区3区精华液| 成在线人永久免费视频播放| 性色av极品无码专区亚洲| 日日操夜夜操免费视频| 免费一级特黄特色大片| 亚洲乱码日产精品a级毛片久久| 午夜成人无码福利免费视频| 中文字幕精品亚洲无线码一区| 久久99免费视频| 亚洲国产精品美女| 女人18毛片a级毛片免费| 美美女高清毛片视频黄的一免费 | 亚洲精品亚洲人成人网| 日韩电影免费在线观看中文字幕| 亚洲成AV人片天堂网无码| 最近中文字幕大全中文字幕免费| 亚洲电影唐人社一区二区| 在线a毛片免费视频观看| 一级毛片成人免费看a| 亚洲AV无码第一区二区三区| 57PAO成人国产永久免费视频| 亚洲av第一网站久章草| 在线精品亚洲一区二区三区| 久久久久高潮毛片免费全部播放| 亚洲综合中文字幕无线码| 精品国产亚洲男女在线线电影 | 99久久99久久免费精品小说| 国产成人精品亚洲2020| 亚洲亚洲人成综合网络| 欧洲一级毛片免费| 一级毛片高清免费播放| 亚洲人成网站在线观看播放青青| 免费成人黄色大片|