2013-12-09 125 views
2

我有一個應用程序使用各種第三方API的第三方API之一在單獨的線程中執行。線程上的Java安全管理器

我想要一個特定的線程訪問特定的目錄並限制該線程訪問本地磁盤的其他目錄。

這是可能通過java安全管理器來實現嗎?

回答

1

假設您打算信任的庫寫得很好,您可以爲策略文件中的每個庫設置權限,並在線程內或其構造周圍添加對java.security.AccessController.doPrivileged的調用。通常的免責聲明,寫得不好的可信代碼將允許不可信的代碼利用其信任。

自1998年發佈Java 2以來,「自定義」安全管理器通常是不必要的,但它似乎出現在許多民間內存中。

2

如果我理解正確,這聽起來像你想要做的是限制訪問您正在使用的第三方庫之一的文件系統。就Java SecurityManager而言,這個特定的第三方庫在單獨的線程中運行的事實並不相關:Java安全策略根據從何處加載代碼授予權限,是否已簽名或是誰運行代碼,但不是基於運行代碼的線程。

要限制特定庫對文件系統某些區域的訪問,您需要一個策略文件來授予必要的權限到所有其他代碼,以及對要限制的庫的有限權限。假設你正在運行的代碼是一組獨立的jar文件,你不希望任何限制對任何其他代碼的,你的政策文件將是這個樣子:

grant codebase "file:/path/to/your-application.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/trusted-library.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/another-trusted-library.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/restricted-library.jar" { 
    permission java.io.FilePermission "/path/to/particular/directory", "read,write"; 
    // Any additional permissions this library needs 
}; 

它可能通過一些試驗和錯誤來發現您需要授予受限制庫以便其正確運行的其他特定權限。

如果您的要求確實是限制對特定線程的訪問,則需要編寫自定義SecurityManager並覆蓋checkPermission方法,以便它們檢查哪個線程正在調用方法以確定權限是否應該是理所當然的。您需要向自定義SecurityManager添加方法以允許您的應用程序代碼註冊哪些線程應該被限制,並且您需要確保這些附加方法不能被限制代碼調用,例如創建並檢查自定義權限。

編寫自定義SecurityManagers通常比使用標準SecurityManager更具風險,因此如果採用此方法,您需要進行一些仔細的測試。