av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

淺談Java訪(fǎng)問(wèn)控制機(jī)制

Java 訪(fǎng)問(wèn)控制機(jī)制的原理是:在某些策略配置文件中預(yù)定義好某些代碼對(duì)某些資源具有某些操作權(quán)限,當(dāng)某些代碼以某個(gè)權(quán)限訪(fǎng)問(wèn)某個(gè)資源的時(shí)候,如果對(duì)該資源預(yù)指定的權(quán)限中沒(méi)有該權(quán)限,則禁止訪(fǎng)問(wèn),否則可以訪(fǎng)問(wèn)。

成都創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、麻城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、成都商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為麻城等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

上面一段話(huà)讀起來(lái)比較晦澀,下面先以數(shù)據(jù)庫(kù)用戶(hù)和數(shù)據(jù)表為例來(lái)說(shuō)明。

指定某些代碼對(duì)某些資源具有某些操作權(quán)限

某些代碼:用戶(hù) Admin, X

某些資源:數(shù)據(jù)庫(kù)表 User

操作權(quán)限:用戶(hù) Admin(某些代碼)對(duì) User 表(某些資源) 具有 CRUD 權(quán)限

用戶(hù) X(某些代碼)對(duì) User 表(某些資源) 具有 R 權(quán)限

某些代碼以某個(gè)權(quán)限訪(fǎng)問(wèn)某個(gè)資源

用戶(hù) X(某些代碼)查詢(xún)(某個(gè)權(quán)限) User 表(某些資源),因?yàn)轭A(yù)定義中用戶(hù) X 對(duì) User 表是有查詢(xún)權(quán)限的,所以檢查通過(guò)

用戶(hù) X(某些代碼)刪除(某個(gè)權(quán)限) User 表(某些資源) 中某條數(shù)據(jù),因?yàn)轭A(yù)定義中用戶(hù) X 對(duì) User 表只有查詢(xún)權(quán)限,沒(méi)有刪除權(quán)限的,所以檢查不通過(guò)

在 Java 中,道理也是一樣的,只是 Java 中某個(gè)類(lèi)相當(dāng)于上面的某個(gè)用戶(hù),如 ClassA 相當(dāng)于用戶(hù) Admin, ClassB 相當(dāng)于用戶(hù) X。 但是在 Java 中情況稍微復(fù)雜一點(diǎn),比如 ClassB 可以調(diào)用 ClassA 的方法,那么這時(shí)候,權(quán)限將如何檢查呢?還是以例子來(lái)說(shuō)明。

指定某些代碼對(duì)某些資源具有某些操作權(quán)限

某些代碼:用戶(hù) ClassA, ClassB

某些資源:某個(gè)配置文件 x.properties

操作權(quán)限:ClassA(某些代碼)對(duì) x.properties(某些資源) 具有讀寫(xiě)權(quán)限

ClassB(某些代碼)對(duì) x.properties(某些資源) 具有讀權(quán)限

某些代碼以某個(gè)權(quán)限訪(fǎng)問(wèn)某個(gè)資源

ClassA(某些代碼)讀或?qū)?某個(gè)權(quán)限) 配置文件x.properties(某些資源),因?yàn)轭A(yù)定義中ClassA 對(duì) x.properties是有讀和寫(xiě)權(quán)限的,所以檢查通過(guò)

ClassB(某些代碼)讀(某個(gè)權(quán)限) 配置文件x.properties(某些資源),因?yàn)轭A(yù)定義中ClassB對(duì) x.properties是有讀權(quán)限的,所以檢查通過(guò)

ClassB(某些代碼)寫(xiě)(某個(gè)權(quán)限) 配置文件x.properties(某些資源),因?yàn)轭A(yù)定義中ClassB對(duì) x.properties是沒(méi)有寫(xiě)權(quán)限的,所以檢查不通過(guò)

Class B 調(diào)用 ClassA 的寫(xiě) x.properties 文件方法,是什么檢查過(guò)程呢?

在 Java 中,不管有幾個(gè)類(lèi)的反復(fù)調(diào)用,最終都是以某個(gè)權(quán)限操作某個(gè)資源,如這里是 Class B 調(diào)用 ClassA,其最終操作權(quán)限是以寫(xiě)的權(quán)限去操作 x.properties 文件。那么 Java 就會(huì)對(duì)反復(fù)調(diào)用過(guò)程中的所有類(lèi)進(jìn)行檢查,看它們對(duì) x.properties 文件是否有寫(xiě)權(quán)限,如果都有則通過(guò),只要任何一個(gè)類(lèi)沒(méi)有該權(quán)限,則不通過(guò)。

其中檢查的過(guò)程與調(diào)用過(guò)程是互為逆向的。如在上例中,ClassB 調(diào)用 ClassA 的去寫(xiě) x.properties 文件,那么 JVM 就會(huì)先檢查 ClassA 對(duì) x.properties 文件是否有寫(xiě)權(quán)限,因?yàn)轭A(yù)定義中有,所以 ClassA 通過(guò)。接下來(lái)檢查 ClassB,因?yàn)轭A(yù)定義中,ClassB對(duì) x.properties 文件沒(méi)有寫(xiě) 權(quán)限,所以檢查不通過(guò),本次操作失敗。

在 Java 訪(fǎng)問(wèn)控制機(jī)制中,主要有以下幾個(gè)類(lèi):

SecurityManager

AccessController

AccessControlContext

ProtectionDomain

PermissionCollection

Permission

Policy

SecurityManager/ AccessController

訪(fǎng)問(wèn)控制的入口類(lèi)。在 Java 中,訪(fǎng)問(wèn)控制默認(rèn)是關(guān)閉的。

AccessControlContext

類(lèi)的調(diào)用過(guò)程上下文。它以棧的形式保存類(lèi)的調(diào)用過(guò)程,如在上面例子中,ClassB 調(diào)用 ClassA,那么 AccessControlContext 的棧底是 ClassB,棧頂是 ClassA,如果 ClassA 再調(diào)用 ClassC,那么 ClassC 在壓入棧,棧頂變成了 ClassC

ProtectionDomain

這是一個(gè)關(guān)鍵的類(lèi)。它定義了“某些代碼對(duì)某些資源具有某些操作權(quán)限”,亦即那個(gè)目錄下的代碼對(duì)那些資源有哪些操作權(quán)限。它有三個(gè)屬性:

某些代碼

一般是指某個(gè)目錄下的所有代碼,如 “JRE_HOEM/lib/ext”在 Java 中表示為 CodeBase

某些資源

比如 conf 目錄下的文件,在 Java 中表現(xiàn)為某個(gè)文件(夾)路徑 BasePath

某些權(quán)限

是指某些代碼對(duì)對(duì)某些資源操作權(quán)限的集合,比如讀權(quán)限、寫(xiě)權(quán)限,在 Java 中表現(xiàn)為 PermissionCollection 類(lèi)。

PermissionCollection

權(quán)限的集合類(lèi)。如文件讀權(quán)限、文件寫(xiě)權(quán)限的集合:

FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)

FilePermission(file,SecurityConstants.FILE_READ_ACTION)

Permission

某個(gè)具體的權(quán)限。如文件讀權(quán)限 FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)

Policy

“指定某些代碼對(duì)某些資源具有某些操作權(quán)限”的策略定義在策略文件中,Policy 負(fù)責(zé)從配置文件中讀取這些策略,并根據(jù)策略文件構(gòu)建 ProtectionDomain。JVM 中只有一個(gè) Policy 對(duì)象。

“某些代碼對(duì)某些資源具有某些操作權(quán)限”建立過(guò)程

在 Java 中,每個(gè)類(lèi)都有一個(gè) ProtectionDomain 的一個(gè)引用,因?yàn)槊總€(gè)類(lèi)都屬于某個(gè)特定的目錄下,這樣就可以知道某個(gè)類(lèi)對(duì)某些資源有哪些操作權(quán)限了。下面看每個(gè)類(lèi)與 ProtectionDomain 建立關(guān)系的過(guò)程:

當(dāng) ClassLoader 去加載一個(gè) class 的時(shí)候,它會(huì)把這個(gè)類(lèi)及授給這個(gè)類(lèi)的權(quán)限集封裝到“java.security.ProtectionDomain”中,其中這些權(quán)限是通過(guò) ClassLoader并根據(jù)策略文件進(jìn)行分配的。

1) 找到類(lèi)字節(jié)碼的加載 URL

2) 如果這個(gè)類(lèi)是從包 java.* 中加載的,那就把該類(lèi)與內(nèi)在的 System ProtectionDomain 關(guān)聯(lián),其中 System ProtectionDomain 是具有全部權(quán)限(AllPermission)的。如果該類(lèi)不是從包 java.* 中加載的,則繼續(xù)

3) 如果該類(lèi)要關(guān)聯(lián)的 ProtectionDomain 以及存在,則直接添加它們之間引用關(guān)系即可,否則繼續(xù)

4) 創(chuàng)建一個(gè) CodeSource 對(duì)象,里面封裝了類(lèi)字節(jié)碼的加載路徑

5) 創(chuàng)建一個(gè) PermissionCollection 對(duì)象,并把策略文件中賦給 CodeSource 的權(quán)限封裝到該 PC 對(duì)象中

6) 創(chuàng)建一個(gè) ProtectionDomain,里面封裝了 CodeSource 和 PermissionCollection 對(duì)象,即那些代碼對(duì)那些資源有那些操作權(quán)限:ProtectionDomain = new ProtectionDomain(CodeSource,PermissionCollection)

7) 把剛加載的 class 類(lèi)與當(dāng)前的 ProtectionDomain 關(guān)聯(lián)

各個(gè)類(lèi)之間引用調(diào)用關(guān)系這里不闡述,下面繼續(xù)看例子:

現(xiàn)在假設(shè)有如下代碼:${user.dir}/testA/ClassA ${user.dir}/testB/ClassB

有如下資源:${user.dir}/conf/x.properties

加入在 Java 策略文件中添加如下策略:

grant codeBase "file:${user.dir}/testA/*" {

permission java.io.FilePermission "${user.dir}/conf *", "read";

permission java.io.FilePermission "${user.dir}/conf *", "write";

};

grant codeBase "file:${user.dir}/testB/*" {

permission java.io.FilePermission "${user.dir}/conf *", "read";

};

上面有提到,在Java 中每個(gè) Class都保存有 ProtectionDomain的引用,這里 ClassA 和 ClassB 的 ProtectionDomain 模型如下:

下面假設(shè) ClassB 調(diào)用 ClassA 的去寫(xiě) x.poperties 文件,那么 AccessControlContext 和 PermissionCollection 對(duì)應(yīng)模型是這樣的:

當(dāng) AccessController.checkPermission 開(kāi)始檢查權(quán)限時(shí),它知道要本次要檢查的權(quán)限是 FilePermission(“x.properties”, “write”),即對(duì) “x.properties”的寫(xiě)權(quán)限。于是它先獲取調(diào)用過(guò)程上下文中所有類(lèi)(main(JVM)-->ClassB-->ClassA-->FileOutputStream-->AccessController)的 ProtectedDomain 找出來(lái):

JVM 從 mian 執(zhí)行的,它的 ProtectedDomain 是 SystemDomain

ClassA 的 ProtectedDomain 是 ProtectedDomainA

ClassB 的 ProtectedDomain 是 ProtectedDomainB

FileInputStream 和 AccessController 的 ProtectedDomain 是 SystemDomain

把訪(fǎng)問(wèn)上下文的 ProtectedDomain 都找出來(lái)后,就逐個(gè)檢查每個(gè) ProtectedDomain 是否有 FilePermission(“x.properties”, “write”) 權(quán)限。因?yàn)樵?Java 訪(fǎng)問(wèn)控制機(jī)制中,它要確保每個(gè)調(diào)用的類(lèi)都有該權(quán)限才能通過(guò)檢查。

于是,開(kāi)始做下面檢查:

1) AccessController-->SystemDomain : Java 內(nèi)部代碼保護(hù)域,具有所有操作權(quán)限,檢查通過(guò)

2) FileInputStream-->SystemDomain : Java 內(nèi)部代碼保護(hù)域,具有所有操作權(quán)限,檢查通過(guò)

3) ClassA-->ProtectedDomainA: 在上面的 ProtectedDomainA 模型中,我們知道它是有 FilePermission(“x.properties”, “write”) 權(quán)限的,檢查通過(guò)

4) ClassB-->ProtectedDomainB: 在上面的 ProtectedDomainB 模型中,我們知道它沒(méi)有 FilePermission(“x.properties”, “write”) 權(quán)限的,檢查不通過(guò)


網(wǎng)站標(biāo)題:淺談Java訪(fǎng)問(wèn)控制機(jī)制
轉(zhuǎn)載來(lái)源:http://uogjgqi.cn/article/dhiecee.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流