Как отключить менеджер безопасности Java?

Есть ли способ полностью отключить менеджер безопасности Java?

Я экспериментирую с исходным кодом db4o. Он использует отражение для сохранения объектов, и кажется, что менеджер безопасности не позволяет отражению читать и писать частные или защищенные поля.

Мой код:

public static void main(String[] args) throws IOException {
    System.out.println("start");
    new File( DB_FILE_NAME ).delete();
    ObjectContainer container = Db4o.openFile( DB_FILE_NAME );
    String ob = new String( "test" );
    container.store( ob );
    ObjectSet result = container.queryByExample( String.class );
    System.out.println( "retrieved (" + result.size() + "):" );
    while( result.hasNext() ) {
        System.out.println( result.next() );
    }
    container.close();
    System.out.println("finish");
}

Выход:

Начните
[db4o 7.4.68.12069   2009-04-18 00:21:30] 
 AccessibleObject#setAccessible() недоступен. Частные поля не могут быть сохранены.
найдено (0):
Конец


В этой теме предлагается изменить файл java.policy, чтобы разрешить отражение, но, похоже, он мне не подходит.

Я запускаю JVM с аргументами
-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
указанный файл политики будет единственным используемым файлом политики

Файл выглядит так:

предоставить {
    разрешение java.security.AllPermission;
    разрешение java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

Я потратил на это последние 3 часа и не имею ни малейшего представления, как это сделать. Любая помощь приветствуется.

3 ответа

Вы можете попробовать добавить это в main() вашей программы:

System.setSecurityManager(null);

Я работал в "доверенном" приложении WebStart, когда у меня были проблемы с менеджером безопасности. Не уверен, что он подойдет для вашего случая с db4o, но стоит попробовать.

РЕДАКТИРОВАТЬ: я не предполагаю, что это общее решение проблем менеджера безопасности. Я просто предложил это как способ помочь отладить проблему оригинального плаката. Очевидно, что если вы хотите воспользоваться менеджером безопасности, вам не следует его отключать.

У вас действительно есть два знака "=" в вашем java.security.policy опция командной строки? Это не сработает. Убедитесь, что вы устанавливаете свойство как

-Djava.security.policy=/home/pablo/.java.policy

На самом деле отключить SecurityManagerпросто уходя java.security.manager системных свойств в целом должно быть достаточно.


Обновление. Когда я читал документацию по файлам политики, чтобы узнать больше о синтаксисе "==", я заметил, что, если файл политики не находится в текущем рабочем каталоге, его нужно указывать в виде URL (включая схему). Вы пробовали префикс пути политики со схемой "file:"?

Я также был озадачен, потому что (при условии, что вы работаете от имени пользователя "pablo"), похоже, что политика должна быть загружена по умолчанию из вашего домашнего каталога, поэтому вам не нужно указывать ее вообще. С другой стороны, если вы не работаете как пользователь "pablo", возможно, файл не читается.

Я нашел этот пример того, как сделать приватные поля и методы доступными для вашего кода. В основном, это сводится к использованию Field.setAccessible (true) и Method.setAccessible (true)

Пример поля:

Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");

privateStringField.setAccessible(true);

Пример метода:

Method privateStringMethod = PrivateObject.class.
        getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);

Вы также можете посмотреть на использование Groovy с вашим Java-кодом, так как он (в настоящее время) обходит многие ограничения уровня доступа Java-кода. Хотя эта публикация на доске объявлений, кажется, предполагает, что эта "функция" может измениться в будущих версиях Groovy.

Другие вопросы по тегам