成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Java訪問控制機制

開發 后端
Java 訪問控制機制的原理是:在某些策略配置文件中預定義好某些代碼對某些資源具有某些操作權限,當某些代碼以某個權限訪問某個資源的時候,如果對該資源預指定的權限中沒有該權限,則禁止訪問,否則可以訪問。

Java 訪問控制機制的原理是:在某些策略配置文件中預定義好某些代碼對某些資源具有某些操作權限,當某些代碼以某個權限訪問某個資源的時候,如果對該資源預指定的權限中沒有該權限,則禁止訪問,否則可以訪問。

上面一段話讀起來比較晦澀,下面先以數據庫用戶和數據表為例來說明。

指定某些代碼對某些資源具有某些操作權限

某些代碼:用戶 Admin, X

某些資源:數據庫表 User

操作權限:用戶 Admin(某些代碼)對 User 表(某些資源) 具有 CRUD 權限

用戶 X(某些代碼)對 User 表(某些資源) 具有 R 權限

某些代碼以某個權限訪問某個資源

用戶 X(某些代碼)查詢(某個權限) User 表(某些資源),因為預定義中用戶 X 對 User 表是有查詢權限的,所以檢查通過

用戶 X(某些代碼)刪除(某個權限) User 表(某些資源) 中某條數據,因為預定義中用戶 X 對 User 表只有查詢權限,沒有刪除權限的,所以檢查不通過

在 Java 中,道理也是一樣的,只是 Java 中某個類相當于上面的某個用戶,如 ClassA 相當于用戶 Admin, ClassB 相當于用戶 X。 但是在 Java 中情況稍微復雜一點,比如 ClassB 可以調用 ClassA 的方法,那么這時候,權限將如何檢查呢?還是以例子來說明。

指定某些代碼對某些資源具有某些操作權限

某些代碼:用戶 ClassA, ClassB

某些資源:某個配置文件 x.properties

操作權限:ClassA(某些代碼)對 x.properties(某些資源) 具有讀寫權限

ClassB(某些代碼)對 x.properties(某些資源) 具有讀權限

某些代碼以某個權限訪問某個資源

ClassA(某些代碼)讀或寫(某個權限) 配置文件x.properties(某些資源),因為預定義中ClassA 對 x.properties是有讀和寫權限的,所以檢查通過

ClassB(某些代碼)讀(某個權限) 配置文件x.properties(某些資源),因為預定義中ClassB對 x.properties是有讀權限的,所以檢查通過

ClassB(某些代碼)寫(某個權限) 配置文件x.properties(某些資源),因為預定義中ClassB對 x.properties是沒有寫權限的,所以檢查不通過

Class B 調用 ClassA 的寫 x.properties 文件方法,是什么檢查過程呢?

在 Java 中,不管有幾個類的反復調用,最終都是以某個權限操作某個資源,如這里是 Class B 調用 ClassA,其最終操作權限是以寫的權限去操作 x.properties 文件。那么 Java 就會對反復調用過程中的所有類進行檢查,看它們對 x.properties 文件是否有寫權限,如果都有則通過,只要任何一個類沒有該權限,則不通過。

其中檢查的過程與調用過程是互為逆向的。如在上例中,ClassB 調用 ClassA 的去寫 x.properties 文件,那么 JVM 就會先檢查 ClassA 對 x.properties 文件是否有寫權限,因為預定義中有,所以 ClassA 通過。接下來檢查 ClassB,因為預定義中,ClassB對 x.properties 文件沒有寫 權限,所以檢查不通過,本次操作失敗。

在 Java 訪問控制機制中,主要有以下幾個類:

SecurityManager

AccessController

AccessControlContext

ProtectionDomain

PermissionCollection

Permission

Policy

SecurityManager/ AccessController

訪問控制的入口類。在 Java 中,訪問控制默認是關閉的。

AccessControlContext

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

ProtectionDomain

這是一個關鍵的類。它定義了“某些代碼對某些資源具有某些操作權限”,亦即那個目錄下的代碼對那些資源有哪些操作權限。它有三個屬性:

某些代碼

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

某些資源

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

某些權限

是指某些代碼對對某些資源操作權限的集合,比如讀權限、寫權限,在 Java 中表現為 PermissionCollection 類。

PermissionCollection

權限的集合類。如文件讀權限、文件寫權限的集合:

FilePermission(file,SecurityConstants.FILE_WRITE_ACTION)

FilePermission(file,SecurityConstants.FILE_READ_ACTION)

Permission

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

Policy

“指定某些代碼對某些資源具有某些操作權限”的策略定義在策略文件中,Policy 負責從配置文件中讀取這些策略,并根據策略文件構建 ProtectionDomain。JVM 中只有一個 Policy 對象。

“某些代碼對某些資源具有某些操作權限”建立過程

在 Java 中,每個類都有一個 ProtectionDomain 的一個引用,因為每個類都屬于某個特定的目錄下,這樣就可以知道某個類對某些資源有哪些操作權限了。下面看每個類與 ProtectionDomain 建立關系的過程:

當 ClassLoader 去加載一個 class 的時候,它會把這個類及授給這個類的權限集封裝到“java.security.ProtectionDomain”中,其中這些權限是通過 ClassLoader并根據策略文件進行分配的。

1) 找到類字節碼的加載 URL

2) 如果這個類是從包 java.* 中加載的,那就把該類與內在的 System ProtectionDomain 關聯,其中 System ProtectionDomain 是具有全部權限(AllPermission)的。如果該類不是從包 java.* 中加載的,則繼續

3) 如果該類要關聯的 ProtectionDomain 以及存在,則直接添加它們之間引用關系即可,否則繼續

4) 創建一個 CodeSource 對象,里面封裝了類字節碼的加載路徑

5) 創建一個 PermissionCollection 對象,并把策略文件中賦給 CodeSource 的權限封裝到該 PC 對象中

6) 創建一個 ProtectionDomain,里面封裝了 CodeSource 和 PermissionCollection 對象,即那些代碼對那些資源有那些操作權限:ProtectionDomain = new ProtectionDomain(CodeSource,PermissionCollection)

7) 把剛加載的 class 類與當前的 ProtectionDomain 關聯

各個類之間引用調用關系這里不闡述,下面繼續看例子:

現在假設有如下代碼:${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 中每個 Class都保存有 ProtectionDomain的引用,這里 ClassA 和 ClassB 的 ProtectionDomain 模型如下:

 

 

 

 

下面假設 ClassB 調用 ClassA 的去寫 x.poperties 文件,那么 AccessControlContext 和 PermissionCollection 對應模型是這樣的:

 

 

當 AccessController.checkPermission 開始檢查權限時,它知道要本次要檢查的權限是 FilePermission(“x.properties”, “write”),即對 “x.properties”的寫權限。于是它先獲取調用過程上下文中所有類(main(JVM)-->ClassB-->ClassA-->FileOutputStream-->AccessController)的 ProtectedDomain 找出來:

JVM 從 mian 執行的,它的 ProtectedDomain 是 SystemDomain

ClassA 的 ProtectedDomain 是 ProtectedDomainA

ClassB 的 ProtectedDomain 是 ProtectedDomainB

FileInputStream 和 AccessController 的 ProtectedDomain 是 SystemDomain

把訪問上下文的 ProtectedDomain 都找出來后,就逐個檢查每個 ProtectedDomain 是否有 FilePermission(“x.properties”, “write”) 權限。因為在 Java 訪問控制機制中,它要確保每個調用的類都有該權限才能通過檢查。

于是,開始做下面檢查:

1) AccessController-->SystemDomain : Java 內部代碼保護域,具有所有操作權限,檢查通過

2) FileInputStream-->SystemDomain : Java 內部代碼保護域,具有所有操作權限,檢查通過

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

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

責任編輯:金賀 來源: JavaEye博客
相關推薦

2023-12-06 21:50:40

2021-07-09 13:54:31

零信任網絡安全網絡攻擊

2012-05-09 09:09:58

訪問控制

2011-03-15 14:17:28

Oracle自主訪問

2011-02-22 15:51:41

2009-07-16 09:46:20

iBATIS Log機

2012-01-10 10:05:47

文件目錄訪問控制UGO

2009-08-26 13:15:38

C#選擇控制

2019-04-16 11:02:10

TCPIPLinux

2010-09-29 16:38:03

企業應用訪問

2009-07-20 17:12:17

ASP.NET訪問數據

2010-04-16 11:17:33

hints調整

2019-05-10 14:00:21

小程序運行機制前端

2020-09-30 06:47:22

Kotlin機制

2009-06-30 09:55:24

Spring運作機制

2013-09-29 15:11:46

Linux運維內存管理

2017-04-26 14:15:35

瀏覽器緩存機制

2010-01-26 14:43:53

Android數據存儲

2009-08-19 10:54:42

ASP.NET數據訪問

2014-03-11 15:47:29

大型網站速度優化運維人員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区蜜臀 | 欧洲精品一区 | 羞羞网站在线观看 | 国产高清视频一区 | 欧美精品成人影院 | 91黄色片免费看 | 欧美日韩在线免费观看 | 国产精品久久久久一区二区三区 | 亚洲免费片 | 免费黄视频网站 | 免费一区在线 | 亚洲va在线va天堂va狼色在线 | 天堂一区二区三区 | 四虎影视在线 | 99精品热视频 | 一区二区在线不卡 | 日韩三区在线观看 | 精品一区国产 | www.国产视频 | 欧美片网站免费 | 中文字幕免费观看 | 久久99精品久久久久婷婷 | 亚洲毛片在线 | 视频一二三区 | 黄色网络在线观看 | 亚洲高清在线观看 | 精品乱子伦一区二区三区 | 久久精品国产一区二区三区不卡 | 成人小视频在线观看 | 成人a网 | 中文字幕一区二区三区四区 | 影音先锋中文在线 | 人人草人人干 | 亚洲精品久久久久久久久久久 | 欧美456| 久久久久久毛片免费观看 | 97人人澡人人爽91综合色 | 欧美专区在线视频 | www四虎com| 激情小说综合网 | 国产99精品|