1. 程式人生 > >6.jvm之自定義安全管理器

6.jvm之自定義安全管理器

       安全管理器SecurityManager裡設計的內容實在是非常的龐大,它的核心方法就是checkPerssiom這個方法裡又呼叫AccessController的checkPerssiom方法,訪問控制器AccessController的棧檢查機制又遍歷整個PerssiomCollection來判斷具體擁有什麼許可權一旦發現棧中一個許可權不允許的時候丟擲異常否則簡單的返回,這個過程實際上比我的描述要複雜得多,這裡我只是簡單的一句帶過,因為這裡涉及到很多比較後面的知識點。

                下面來嘗試一下寫一個非常簡單的demo,旨在讓你有一個比較形象的思維,不會在概念上打轉。

                第一步,定義一個類繼承自SecurityManger重寫它的checkRead方(如果你有興趣可以先跳到super.checkRead(file, context);看看,當然不看也沒有關係,我們後面的章節會基於這個demo做擴充套件的時候也會講到)。             

  1. package com.yfq.test;  
  2. publicclass MySecurityManager extends SecurityManager {  
  3.     @Override
  4.     publicvoid checkRead(String file) {  
  5.         //super.checkRead(file, context);
  6.         if (file.endsWith("test"))    
  7.         thrownew SecurityException("你沒有讀取的本檔案的許可權");    
  8.     }  
  9. }  


                第二步,定義一個有main函式的public類來驗證自己的安全管理器是不是器作用了。

  1. package com.yfq.test;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. publicclass TestMySecurityManager {  
  5.     public
    staticvoid main(String[] args) {  
  6.         System.setSecurityManager(new MySecurityManager());  
  7.         try {  
  8.             FileInputStream fis = new FileInputStream("test");  
  9.             System.out.println(fis.read());  
  10.         } catch (IOException e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.     }  
  14. }  


                  第三步,執行程式碼檢視控制檯輸出

Exception in thread "main" java.lang.SecurityException: 你沒有讀取的本檔案的許可權
 at com.yfq.test.MySecurityManager.checkRead(MySecurityManager.java:9)
 at java.io.FileInputStream.<init>(FileInputStream.java:100)
 at java.io.FileInputStream.<init>(FileInputStream.java:66)
 at com.yfq.test.TestMySecurityManager.main(TestMySecurityManager.java:10)

 從上面的異常我們發現,安全管理器起作用了。讀過筆記四的人應該會發現,這裡我們用到了一個筆記四提到的方法:System.setSecurityManager(new MySecurityManager());這個是安裝安全管理器的另外一種方法,筆記四中我們曾經用-Djava.security.manager安裝過預設的安全管理器,有印象不?

拓展內容

好了,我們的安全管理器是怎麼被執行的呢?如果你有興趣可以繼續往下看一下,也可以跳過,這裡只是簡單的介紹一下,也是本人習慣的學習思路

直接跳到FileInputStream的建構函式裡,下面貼出程式碼,簡單閱讀一下

  1. public FileInputStream(File file) throws FileNotFoundException {  
  2. String name = (file != null ? file.getPath() : null);  
  3. SecurityManager security = System.getSecurityManager();  
  4. if (security != null) {  
  5.     security.checkRead(name);  
  6. }  
  7.        if (name == null) {  
  8.            thrownew NullPointerException();  
  9.        }  
  10. fd = new FileDescriptor();  
  11. open(name);  
  12.    }  

發現沒?它首先執行SecurityManager security = System.getSecurityManager();,然後再呼叫security的checkRead方法,就是這麼簡單。

如果你還有興趣那麼繼續往下讀,在使用java的File時,你是否用過setWritable(boolean, boolean),讓你可以指定建立檔案的許可權,學習了安全管理器之後你有沒有有豁然開朗的感覺,它是怎麼實現的,相信你已經猜到了,沒有錯就是安全管理器設定許可權啦。下面貼出它的程式碼,同時也引入一個新的概念Permission

  1. publicboolean setWritable(boolean writable, boolean ownerOnly) {  
  2. SecurityManager security = System.getSecurityManager();  
  3. if (security != null) {  
  4.     security.checkWrite(path);  
  5. }  
  6. return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly);  
  7.    }  


Permisson就是許可權的意思,它僅僅取出安全管理器然後將檔案的許可權設定了一下而已,這個也是後面所有關於許可權的一個不可或缺的類!

好了今天的檔案安全管理器demo就到這裡。意在淺顯易懂!

申明:文章的部分內容有參照網上的其他作者的內容,這裡只用來學習交流!

writed by:keycoding