サードパーティのコンポーネント (Eclipse プラグインではない) を実行できる Eclipse ベースのアプリケーションを開発しています。
各コンポーネントには、パーミッションをリストするカスタム記述子があります (対応する動機とともに)。このようにして、エンドユーザーはそれを実行するかどうかを決定できます。
コンポーネントは別々のスレッドで実行されます。アプリケーション全体を制限せずに、記述子に従ってこれらのスレッドのアクセス許可を制限するにはどうすればよいですか?
サードパーティのコンポーネント (Eclipse プラグインではない) を実行できる Eclipse ベースのアプリケーションを開発しています。
各コンポーネントには、パーミッションをリストするカスタム記述子があります (対応する動機とともに)。このようにして、エンドユーザーはそれを実行するかどうかを決定できます。
コンポーネントは別々のスレッドで実行されます。アプリケーション全体を制限せずに、記述子に従ってこれらのスレッドのアクセス許可を制限するにはどうすればよいですか?
まず、Security Manager をオンにする必要があります。次に、必要な権限を持つAccessControlContextを作成します。(私の例ではパーミッションはありません。)最後に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, 2 番目のスローを出力しますAccessControlException: access denied ("java.lang.RuntimePermission" "exitVM.0")