<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中創(chuàng)建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");
        }


    }

    運行這個例子的時候,會出現(xiàn)權(quán)限錯誤,把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沒有權(quán)限,1有權(quán)限,使用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中調(diào)用,那么1,2需要具有權(quán)限,3不再進(jìn)行檢查
    如果doPrivileged是在1中調(diào)用,那么1需要具有權(quán)限,2,3不再進(jìn)行檢查


    總結(jié):
    1.  這里容易理解錯誤的地方是checking順序,例如一個調(diào)用鏈 MethodA->MethodB->MethodC(這里的3個方法需要在3個不同的ProtectionDomain中),doPrivileged在MethodB中,很容易理解成檢查A,B而不檢查C,實際上stack中檢查順序為C->B->A,也就是檢查C,B而不檢查A

    2. ServiceCentre不需要太多權(quán)限,而Service就需要使用doPrivileged來避免受到ServiceCentre的權(quán)限限制(如果service有足夠的權(quán)限),Equinox中有很多這樣的例子(Equinox扮演Service的角色)。
    posted on 2009-03-11 12:44 Phrancol Yang 閱讀(6761) 評論(1)  編輯  收藏

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 3344永久在线观看视频免费首页| 亚洲AV噜噜一区二区三区| 岛国精品一区免费视频在线观看 | 中文字幕无码日韩专区免费| 免费一级成人毛片| 免费国产在线精品一区| 免费在线视频一区| 国产成人无码精品久久久免费| 亚洲偷自拍拍综合网| 好猛好深好爽好硬免费视频| 国产亚洲精品久久久久秋霞| 不卡视频免费在线观看| 久久久亚洲欧洲日产国码农村| 久久成人免费大片| 亚洲精品无码久久毛片波多野吉衣| 精品一区二区三区无码免费视频| 亚洲欧洲日产国码在线观看| 美女网站免费福利视频| 欧美激情综合亚洲一二区| 亚洲五月午夜免费在线视频| 久久国产乱子精品免费女| 亚洲国产亚洲片在线观看播放| 成年女人免费视频播放77777| 爱情岛论坛亚洲品质自拍视频网站| 亚洲国产成人精品女人久久久| 久久精品无码专区免费| 亚洲欧洲日本精品| 国产精品国产午夜免费福利看| 人妻18毛片a级毛片免费看| 亚洲av无码乱码国产精品fc2| 精品久久久久久久久免费影院| 亚洲AV无码男人的天堂| 亚洲色自偷自拍另类小说| 99蜜桃在线观看免费视频网站| 亚洲婷婷在线视频| 亚洲综合色成在线播放| 91精品成人免费国产片| 青草久久精品亚洲综合专区| 亚洲AV人无码综合在线观看| 成人免费男女视频网站慢动作| selaoban在线视频免费精品|