David.Turing's blog

           

          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)域

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(110)

          我參與的團(tuán)隊(duì)

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊(cè)

          搜索

          積分與排名

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 龙里县| 乌兰浩特市| 蚌埠市| 江油市| 犍为县| 东丰县| 聊城市| 普安县| 明星| 大城县| 海门市| 汨罗市| 晴隆县| 高台县| 宣威市| 华宁县| 西峡县| 双峰县| 佛冈县| 宜春市| 永年县| 左权县| 新竹市| 金华市| 翁牛特旗| 乌什县| 南平市| 景泰县| 开封市| 嵩明县| 博湖县| 桦南县| 杂多县| 乌拉特中旗| 文水县| 进贤县| 梧州市| 聊城市| 唐河县| 常宁市| 泸州市|