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

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

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

    隨筆 - 1  文章 - 37  trackbacks - 0
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    留言簿(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 閱讀(6761) 評論(1)  編輯  收藏

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

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


    網站導航:
     
    主站蜘蛛池模板: 特级做A爰片毛片免费69| 久久国产精品一区免费下载| 成在人线AV无码免费| 亚洲激情视频图片| 美女视频黄的全免费视频| 亚洲欧洲另类春色校园网站| 国产电影午夜成年免费视频| 亚洲性无码av在线| 最近的中文字幕大全免费版| 在线观看亚洲AV日韩A∨| 免费无码又爽又刺激高潮的视频| 亚洲精品无码不卡在线播放| 国产无遮挡又黄又爽免费视频| 国产综合激情在线亚洲第一页| 国产成人3p视频免费观看| 麻豆安全免费网址入口| 亚洲精品无码久久久久AV麻豆| 一区二区三区免费视频网站| 国产精品亚洲аv无码播放| 久久亚洲免费视频| 亚洲国产视频一区| 国产91在线免费| 精品乱子伦一区二区三区高清免费播放 | 成人爱做日本视频免费| 国产大陆亚洲精品国产| 亚洲色中文字幕无码AV| 5g影院5g天天爽永久免费影院| 国产亚洲精品bv在线观看| 四虎成人精品在永久免费| a级片在线免费看| 亚洲jjzzjjzz在线播放| 亚洲成aⅴ人片久青草影院| a毛片全部播放免费视频完整18| 亚洲综合在线观看视频| 全免费a级毛片免费看不卡| 香蕉免费在线视频| 亚洲日本乱码卡2卡3卡新区| 免费一级成人毛片| 精品一区二区三区无码免费视频| 亚洲AV永久无码精品网站在线观看| 亚洲永久精品ww47|