У меня есть некоторые эмпирические доказательства, чтобы внести свой вклад после реализации вопроса администратора безопасности:
java SecurityManager, идентичный NO менеджер безопасности, за исключением настройки одной проверки для System.exit
Влияние производительности на этот анонимный внутренний класс было ОГРОМНЫМ:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
return; // no security manager behaviour
}
@Override
public void checkPermission(Permission perm, Object context) {
return; // no security manager behaviour
}
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
Мой опыт после запуска моего приложения в Eclipse заключался в том, что оно было заметно медленнее, и я подтвердил то же самое на компьютере коллеги.
Так что я чувствую, что «незначительное» может быть преуменьшением (и мой вариант использования даже не выполняет никаких проверок!). Считайте это анекдотом, что это не так.
В качестве еще одного примечания: я создал конечный класс с проверками бездействия для ВСЕХ методов, чтобы избежать создания экземпляров объектов разрешений и тому подобного (в конце попросите компилятор jit подключить его) При таком подходе влияние на производительность было действительно минимальным. Таким образом, для людей, которые просто хотят добавить пару конкретных проверок (а не полагаться на политики Java), это фактически оказывает незначительное влияние:
public final class SystemExitTraceSecurityManager extends SecurityManager {
@Override
public final void checkAccept(String host, int port) {
}
@Override
public final void checkAccess(Thread t) {
}
@Override
public final void checkAccess(ThreadGroup g) {
}
@Override
public final void checkAwtEventQueueAccess() {
}
@Override
public final void checkConnect(String host, int port) {
}
@Override
public final void checkConnect(String host, int port, Object context) {
}
@Override
public final void checkCreateClassLoader() {
}
public final void checkDelete(String file) {
};
@Override
public final void checkExec(String cmd) {
}
public final void checkExit(int status) {
Thread.dumpStack();
};
@Override
public final void checkLink(String lib) {
}
@Override
public final void checkListen(int port) {
}
@Override
public final void checkMemberAccess(Class<?> clazz, int which) {
}
@Override
public final void checkMulticast(InetAddress maddr) {
}
@Override
public final void checkMulticast(InetAddress maddr, byte ttl) {
}
@Override
public final void checkPackageAccess(String pkg) {
}
@Override
public final void checkPackageDefinition(String pkg) {
}
@Override
public final void checkPermission(Permission perm) {
}
@Override
public final void checkPermission(Permission perm, Object context) {
}
@Override
public final void checkPrintJobAccess() {
}
@Override
public final void checkPropertiesAccess() {
}
public final void checkPropertyAccess(String key) {
};
@Override
public final void checkRead(FileDescriptor fd) {
}
@Override
public final void checkRead(String file) {
}
@Override
public final void checkRead(String file, Object context) {
}
@Override
public final void checkSecurityAccess(String target) {
}
@Override
public final void checkSetFactory() {
}
@Override
public final void checkSystemClipboardAccess() {
}
@Override
public final boolean checkTopLevelWindow(Object window) {
return true;
}
@Override
public final void checkWrite(FileDescriptor fd) {
}
@Override
public final void checkWrite(String file) {
}
}