Как отключить менеджер безопасности Java? - PullRequest
16 голосов
/ 18 апреля 2009

Есть ли способ полностью отключить диспетчер безопасности 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");
}

Выход:

start
[db4o 7.4.68.12069   2009-04-18 00:21:30] 
 AccessibleObject#setAccessible() is not available. Private fields can not be stored.
retrieved (0):
finish


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

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

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

grant {
    permission java.security.AllPermission;
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

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

Ответы [ 3 ]

6 голосов
/ 18 апреля 2009

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

System.setSecurityManager(null);

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

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

5 голосов
/ 18 апреля 2009

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

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

Чтобы действительно отключить SecurityManager, достаточно просто полностью отключить системное свойство java.security.manager.


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

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

4 голосов
/ 18 апреля 2009

Я нашел этот пример того, как сделать приватные поля и методы доступными для вашего кода. По сути, это сводится к использованию 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 .

...