Работа с "кодовыми базами" в политике безопасности при разработке в 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
- Файл: приложение /-
- Файл:./ приложение /-
- Файл: бен / приложение /-
- Файл:./ бен / приложение /-
- файл:C:/ Полный путь / к / проекту /bin/application/-
- файл://C:/ Полный путь / к / проекту /bin/application/-
(В случае, если это имеет значение: полный путь включает пробелы)
2 ответа
Мне удалось найти проблему, используя отладочный вывод JAAS, который я действительно могу порекомендовать.
Короче говоря, кодовая база - это всегда двоичная корневая папка (или jar), а не папка пакета, содержащая файл класса. В моем случае это означало, что кодовая база всех классов была path/to/project/bin
который не соответствовал path/to/project/bin/application/-
указано в полисе.
Чтобы решить эту проблему, необходимо иметь несколько папок bin или "выходной папки", как их называют в Eclipse. Чтобы получить это:
- Войти в
Project Properties > Java Build Path
и выберитеSource
табуляция - активировать
Allow output folders for source folders
- Добавьте столько исходных папок, сколько захотите, нажав
Add Folder
- Для каждой исходной папки укажите выходную папку, сначала выбрав элемент выходной папки, а затем нажмите "Изменить".
После этого вы можете указать политики для каждой папки, как это
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);
}
Таким образом, вы (и мы) узнаем больше об ошибке, которая может помочь вам найти проблему.