Подтвердить что ты не робот

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

Вывод:

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 часа на это, и у меня нет идей, как это сделать. Любая помощь была оценена.

4b9b3361

Ответ 1

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

System.setSecurityManager(null);

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

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

Ответ 2

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

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

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


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

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

Ответ 3

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