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