Единый вход с Java-клиентом

Я ищу аутентификацию единого входа в Java-клиенте.

Поскольку я вхожу в Windows с помощью AD, основная цель состоит в том, чтобы мне не приходилось снова вводить имя пользователя и пароль. Я хочу, чтобы Java использовала билет, который я получил при входе в Windows. Этот код лучше всего подходит для этой цели:

LoginContext lc = new LoginContext("com.sun.security.jgss.krb5.initiate", new DialogCallbackHandler());
lc.login();
Subject.doAs(lc.getSubject(), (PrivilegedExceptionAction<Void>) () -> {
            System.out.println("This is privileged");
            return null;
        });

Я установил свойства java.security.krb5.conf и java.security.auth.login.config с соответствующими conf-файлами, но по-прежнему появляется диалоговое окно с запросом имени пользователя и пароля.

Я также пробовал работать с GSSName, но GSSManager.createCredential() также запрашивает имя пользователя и пароль (вероятно, используя TextCallbackHandler()).

Я пытался поладить с Вафли, но не получилось. Большинство примеров и объяснений относятся к серверу (я нашел только один пример, сочетающий серверную и клиентскую стороны, но мне не удалось его разделить).

Я знаю, что есть похожие вопросы (например, это), но я не смог заставить это работать без ввода пароля.

PS: я знаю, что DialogCallbackHandler урезан, я использую его только в тестовых целях.

Я немного дальше; С помощью вызова kinit из консоли я могу создать кеш билетов, и я могу использовать созданный билет на Java. Но мне все равно нужно ввести пароль, а кеш билетов действителен только в течение нескольких часов ...

Dániel Somogyi 14.05.2018 11:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
717
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, после нескольких попыток я нашел решение. Проблема была не в коде, а в реестре. Как указано на странице это, начиная с Java 7 вы не можете получить доступ к билету Windows изначально. Чтобы изменить это, вам необходимо установить дополнительный ключ реестра. Для этого заходим в папку реестра

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters

и добавляем ключ

Value Name: AllowTgtSessionKey
Value Type: REG_DWORD
Value: 0x01

Для полноценной работы вам потребуются дополнительные настройки:

Файл конфигурации jaas

В файле конфигурации jaas вы должны указать, какие модули безопасности jaas должен использовать. Часть перед скобками называет вашу конфигурацию. Если вы используете библиотеки GSS, вы должны назвать его com.sun.security.jgss.krb5.initiate. Когда вы используете LoginContext, вы просто передаете имя конфигурации в качестве первого параметра. Мой jaas.conf выглядит следующим образом:

com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache = true;
 };

Конфигурация кербероса

Вам также понадобится конфигурация для модуля Kerberos. В основном он содержит адрес области, но может содержать дополнительную информацию. Минимальный рабочий пример:

[realms]
    YOUR.REALM.COM = {
        kdc = your.realm.com:88
        default_domain = REALM.COM
    }

Обратите внимание, что это чувствительно к регистру!

Свойства системы

Наконец, вы должны настроить Java, чтобы найти эти файлы. Вы делаете это, задавая свойства при запуске или вызывая System.setProperty():

System.setProperty("java.security.krb5.conf", "src/resources/krb5.conf");
System.setProperty("java.security.auth.login.config", "src/resources/jaas.conf");

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