<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

    搜索

    •  

    最新評(píng)論

    示例中需要在eclipse中創(chuàng)建2個(gè)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");
        }


    }

    運(yùn)行這個(gè)例子的時(shí)候,會(huì)出現(xiàn)權(quán)限錯(cuò)誤,把doService()修改一下,就可以順利通過
    public void doService() {

            
    // doFileOperation();

            AccessController.doPrivileged(
    new PrivilegedAction() {
                
    public Object run() {
                    doFileOperation();
                    
    return null;
                }

            }
    );
        }

    在這個(gè)例子中AccessControlContext的stack順序?yàn)?br /> 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

    加入一個(gè)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順序?yàn)?nbsp; 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.  這里容易理解錯(cuò)誤的地方是checking順序,例如一個(gè)調(diào)用鏈 MethodA->MethodB->MethodC(這里的3個(gè)方法需要在3個(gè)不同的ProtectionDomain中),doPrivileged在MethodB中,很容易理解成檢查A,B而不檢查C,實(shí)際上stack中檢查順序?yàn)镃->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) 評(píng)論(1)  編輯  收藏

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: wwwxxx亚洲| 亚洲最大视频网站| 一级毛片免费全部播放| 国产青草视频在线观看免费影院| 久久精品国产亚洲av麻豆图片| 5g影院5g天天爽永久免费影院| 亚洲AV乱码一区二区三区林ゆな| 四虎国产成人永久精品免费| 亚洲国产人成在线观看69网站| 国产成人免费视频| 亚洲综合久久久久久中文字幕| 1000部羞羞禁止免费观看视频 | 亚洲AV无码久久精品狠狠爱浪潮| 国产免费区在线观看十分钟| 亚洲精品无码专区久久久 | 91黑丝国产线观看免费 | 亚洲毛片av日韩av无码| 一区二区三区免费在线观看| 亚洲日韩精品一区二区三区| 一级毛片在线观看免费| 亚洲人成网站在线观看播放动漫| 在线观看免费大黄网站| 黄页网站在线免费观看| 国产亚洲AV无码AV男人的天堂 | 国产成人免费AV在线播放| 久久综合日韩亚洲精品色| 中文毛片无遮挡高潮免费| 亚洲丁香婷婷综合久久| 亚洲第一视频在线观看免费| 18禁在线无遮挡免费观看网站| 亚洲区视频在线观看| 免费永久国产在线视频| 99久久婷婷免费国产综合精品| 亚洲视频在线免费看| 日韩成人免费在线| 免费成人在线电影| 亚洲精品无码专区在线| 亚洲美女又黄又爽在线观看| 啦啦啦高清视频在线观看免费| 国产免费久久久久久无码| 亚洲一级黄色大片|