本文介紹了限制執(zhí)行第三方軟件的線程的權(quán)限的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我正在開發(fā)一個基于Eclipse的應(yīng)用程序,該應(yīng)用程序能夠執(zhí)行第三方組件(不是Eclipse插件)。
每個組件都有一個自定義描述符,該描述符列出了權(quán)限(具有相應(yīng)的動機)。這樣,最終用戶可以決定是否執(zhí)行它。
組件在單獨的線程中執(zhí)行。如何根據(jù)描述符限制這些線程的權(quán)限,而不限制整個應(yīng)用程序?
推薦答案
首先,您應(yīng)該打開安全管理器。然后創(chuàng)建具有所需權(quán)限的AccessControlContext。(在我的示例中沒有權(quán)限。)最后執(zhí)行AccessController.doPrivileged(…)方法中的第三方代碼。
這是一個非常簡單的解決方案:
public abstract class SafeRunnable implements Runnable {
public abstract void protectedRun();
@Override
public final void run() {
CodeSource nullSource = new CodeSource(null, (CodeSigner[]) null);
PermissionCollection noPerms = new Permissions();
ProtectionDomain domain = new ProtectionDomain(nullSource, noPerms);
AccessControlContext safeContext = new AccessControlContext(
new ProtectionDomain[] { domain });
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
protectedRun();
return null;
}
}, safeContext);
}
}
測試SafeRunnable:
public static void main(String args[]) throws Exception {
// Turn on the security management
SecurityManager sm = new SecurityManager();
System.setSecurityManager(sm);
new Thread(new SafeRunnable() {
public void protectedRun() {
// friendly operation:
System.out.println("Hello");
}
}).start();
new Thread(new SafeRunnable() {
public void protectedRun() {
// malicious operation
System.exit(0);
}
}).start();
}
第一線程打印Hello,第二線程拋出AccessControlException: access denied ("java.lang.RuntimePermission" "exitVM.0")
這篇關(guān)于限制執(zhí)行第三方軟件的線程的權(quán)限的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,