2009-12-12 214 views
2

假設我正在編寫一些執行客戶端代碼(Java)的環境。客戶向jar發送清單信息。環境從jar中創建一些類實例(假設Runnable的實例)並在某個線程中運行它。但我需要保證客戶端代碼不會啓動自己的線程或創建自己的ExecutorService等等。線程安全策略

安全經理有沒有可能做到這一級別的限制?如果是這樣,我該如何做到這一點?

回答

2

我能想到的最好方法是使用AspectJ做一些運行時編織,如果有其他線程/ runnables創建,那麼要麼拋出錯誤或以某種方式通知用戶他們有問題。

然後你就可以實現各種安全協議,例如,你可能不僅防止線程,但任何系統調用,例如,就像你可能會禁止動態查詢,只是允許預處理語句。

否則,您可能需要使用反射器API來執行此類型的實現。

+0

這似乎很有趣的想法。我會盡力去解決它。 – 2009-12-12 05:51:06

0

我認爲你需要擴展SecurityManager並使用你自己的實現。

此論壇:http://forums.sun.com/thread.jspa?threadID=761922談論如何重寫SecurityManager.checkAccess(ThreadGroup)以防止創建線程,但聽起來好像沒有特定的「創建線程y/n」權限。

+0

默認情況下,當在允許組中創建線程時,安全管理器不檢查權限。可能是由於向後兼容性。請注意,您始終可以在某些線程上運行代碼,例如終結線程。 – 2009-12-12 05:15:40

+0

當然,它不會默認檢查,因此您需要設置您自己的SecurityManager。 Thread構造函數調用ThreadGroup.checkAccess()方法,該方法調用安全管理器來測試MODIFY_THREADGROUP_PERMISSION。 – Ash 2009-12-12 08:03:52