Работа с "кодовыми базами" в политике безопасности при разработке в Eclipse

Я работаю с политиками безопасности Java, и это все еще довольно ново для меня. Я хотел бы иметь возможность запускать код непосредственно в качестве конфигурации запуска, поэтому у меня есть отладчик и все другие приятные вещи IDE.

Я могу заставить его работать, пока я не использую codebase атрибут в политике.

У меня есть класс в пакете application это создает LoginContext, Файл политики находится в корне моего проекта. С этим контентом он работает нормально:

grant {
   permission javax.security.auth.AuthPermission "createLoginContext.Sample";
   permission javax.security.auth.AuthPermission "doAsPrivileged";
};

Но когда я добавляю кодовую базу, это терпит неудачу с Cannot create LoginContext. access denied ("javax.security.auth.AuthPermission" "createLoginContext.Sample")

grant codebase "file:./bin/application/-" {
   permission javax.security.auth.AuthPermission "createLoginContext.Sample";
   permission javax.security.auth.AuthPermission "doAsPrivileged";
};

Я пробовал эти значения для codebase

  1. Файл: приложение /-
  2. Файл:./ приложение /-
  3. Файл: бен / приложение /-
  4. Файл:./ бен / приложение /-
  5. файл:C:/ Полный путь / к / проекту /bin/application/-
  6. файл://C:/ Полный путь / к / проекту /bin/application/-

(В случае, если это имеет значение: полный путь включает пробелы)

2 ответа

Решение

Мне удалось найти проблему, используя отладочный вывод JAAS, который я действительно могу порекомендовать.

Короче говоря, кодовая база - это всегда двоичная корневая папка (или jar), а не папка пакета, содержащая файл класса. В моем случае это означало, что кодовая база всех классов была path/to/project/bin который не соответствовал path/to/project/bin/application/- указано в полисе.

Чтобы решить эту проблему, необходимо иметь несколько папок bin или "выходной папки", как их называют в Eclipse. Чтобы получить это:

  1. Войти в Project Properties > Java Build Path и выберите Source табуляция
  2. активировать Allow output folders for source folders
  3. Добавьте столько исходных папок, сколько захотите, нажав Add Folder
  4. Для каждой исходной папки укажите выходную папку, сначала выбрав элемент выходной папки, а затем нажмите "Изменить".

Пометка важных кнопок в Свойствах проекта

После этого вы можете указать политики для каждой папки, как это

grant codebase "file:binLogin/-" {
    permission javax.security.auth.AuthPermission "modifyPrincipals";
};

grant codebase "file:binApp/-" {
   permission javax.security.auth.AuthPermission "createLoginContext.Sample";
   permission javax.security.auth.AuthPermission "doAsPrivileged";
};

Я надеюсь, что это может помочь другим в будущем.

Я понимаю, что это может рассматриваться как комментарий, но он слишком велик и может помочь вам найти ответ самостоятельно.

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

  try {
      lc = new LoginContext("Sample",
                      new MyCallbackHandler());
  } catch (LoginException le) {
      System.err.println("Cannot create LoginContext. "
          + le.getMessage());
      System.exit(-1);
  } catch (SecurityException se) {
      System.err.println("Cannot create LoginContext. "
          + se.getMessage());
      System.exit(-1);
  }

к этому:

  try {
      lc = new LoginContext("Sample",
                      new MyCallbackHandler());
  } catch (LoginException le) {
      System.err.println("Cannot create LoginContext. "
          + le.getMessage());
      le.printStackTrace();
      System.exit(-1);
  } catch (SecurityException se) {
      System.err.println("Cannot create LoginContext. "
          + se.getMessage());
      se.printStackTrace();
      System.exit(-1);
  }

Таким образом, вы (и мы) узнаем больше об ошибке, которая может помочь вам найти проблему.

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