原文見諸于http://www.matrix.org.cn/thread.shtml?topicId=41625&forumId=55
有網友提出疑問,
假設JVM已開啟了SecurityManager,并且JASS的登陸模塊等也正常運作,且授權策略文件醒置正確,用戶也已正確地成功地被驗証。如果不執行Subject.doAs()或Subject.doAsPrivileged()方法,JVM會對其它任何方法調用執行權限檢查嗎?如果會,其具的實現過程又是怎樣的?
JAAS授權模型中對下面的情況講得好清楚:
JVM由一個名為 SecurityManager 的類負責實施系統安全策略。在默認情況下不安裝安全管理器,必須通過一個在啟動時傳遞給 JVM 的一個名為 java.security.manager 的環境變量顯式地指定。任何應用程序都可找到安裝的 SecurityManager 并調用它相應的 check<XXX> 方法。
對 SecurityManager 類進行的所有 check<XXX> 方法調用都解釋為相應的 Permission 對象,并將它作為輸入參數傳遞給 AccessController 類的 checkPermission() 方法。 AccessController 類有一個名為 doPrivileged 的方法。doPrivileged 方法以一個類型為 PrivilegedAction 的對象作為輸入。PrivilegedAction 的對象有一個名為 run() 的方法,如果想實現一個執行權限檢查的操作,需從PirvilegedAction中擴展,並在run()方法中實現自己的業務邏輯即可。但問題是,如果不是從PirvilegedAction中擴展的類,那麼調用其中的方法JVM還會不會執行權限檢查?
從java API中可以看到,Subject.doAs()或Subject.doAsPrivileged()方法都以PrivilegedAction作為參數輸入的。
我做了一個小的形象總結:
通常來說,所有在JVM中執行的方法都回進行權限檢查,except 那些由JVM引導的類,比如FileOutputStream和FileInputStream,你也明白你能夠利用FileOuptStream做點什么壞事了,呵呵,于是你寫了一個干壞事的類叫做EsunPirvilegedAction Class,這個類往用戶的user.home寫入n個1G的文件,這個類調用JVM不經過權限檢查的FileOuptStream類。
問題在于,JVM雖然不檢查FileOuptStream類,但會檢查所有在JVM運行中未被授權的類,包括你的
EsunPirvilegedAction類,是否具有權限(判別標準就是C:\yourjdk\jre\lib\security\java.policy)。
1,Permission對象如何Load入,可以看看SecurityManager機制
2,AccessController 類執行checkPermission() 方法,所有不信任的類都不能逃過次"劫",當然,你可以叫所有Client都在其java.policy為你的創建一個Permission。
3,PrivilegedAction是你的EsunPirvilegedAction類所必需實現的方法,否則SecurityManager不理你。
總結性——Java有自己的信任體系,它引導的類以及它的擴展類都不需要checkPermission,你寫的要checkPermission。