安全管理器SecurityManager裏設計的內容實在是很是的龐大,它的核心方法就是checkPerssiom這個方法裏又調用AccessController的checkPerssiom方法,訪問控制器AccessController的棧檢查機制又遍歷整個PerssiomCollection來判斷具體擁有什麼權限一旦發現棧中一個權限不容許的時候拋出異常不然簡單的返回,這個過程實際上比個人描述要複雜得多,這裏我只是簡單的一句帶過,由於這裏涉及到不少比較後面的知識點。java
下面來嘗試一下寫一個很是簡單的demo,旨在讓你有一個比較形象的思惟,不會在概念上打轉。安全
第一步,定義一個類繼承自SecurityManger重寫它的checkRead方(若是你有興趣能夠先跳到super.checkRead(file, context);看看,固然不看也沒有關係,咱們後面的章節會基於這個demo作擴展的時候也會講到)。ide
package com.yfq.test; public class MySecurityManager extends SecurityManager { @Override public void checkRead(String file) { //super.checkRead(file, context); if (file.endsWith("test")) throw new SecurityException("你沒有讀取的本文件的權限"); } }
第二步,定義一個有main函數的public類來驗證本身的安全管理器是否是器做用了。函數
package com.yfq.test; import java.io.FileInputStream; import java.io.IOException; public class TestMySecurityManager { public static void main(String[] args) { System.setSecurityManager(new MySecurityManager()); try { FileInputStream fis = new FileInputStream("test"); System.out.println(fis.read()); } catch (IOException e) { e.printStackTrace(); } } }
第三步,運行代碼查看控制檯輸出學習
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)this
從上面的異常咱們發現,安全管理器起做用了。這裏咱們用到了一個方法:System.setSecurityManager(new MySecurityManager());這個是安裝安全管理器的另一種方法,能夠用-Djava.security.manager安裝默認的安全管理器設計
拓展內容:code
好了,咱們的安全管理器是怎麼被執行的呢?若是你有興趣能夠繼續往下看一下,也能夠跳過,這裏只是簡單的介紹一下,也是本人習慣的學習思路繼承
直接跳到FileInputStream的構造函數裏,下面貼出代碼,簡單閱讀一下ip
public FileInputStream(File file) throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(name); } if (name == null) { throw new NullPointerException(); } fd = new FileDescriptor(); open(name); }
發現沒?它首先執行SecurityManager security = System.getSecurityManager();,而後再調用security的checkRead方法,就是這麼簡單。
若是你還有興趣那麼繼續往下讀,在使用java的File時,你是否用過setWritable(boolean, boolean),讓你能夠指定建立文件的權限,學習了安全管理器以後你有沒有有豁然開朗的感受,它是怎麼實現的,相信你已經猜到了,沒有錯就是安全管理器設置權限啦。下面貼出它的代碼,同時也引入一個新的概念Permission
public boolean setWritable(boolean writable, boolean ownerOnly) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkWrite(path); } return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly); }
Permisson就是權限的意思,它僅僅取出安全管理器而後將文件的權限設置了一下而已,這個也是後面全部關於權限的一個不可或缺的類!