Вы можете определить причину проблемы благодаря LoginException.getCause()
.Если это исключение доступно, это может быть IOException
или KrbException
.
Я использую этот хороший пример в качестве контрольного примера и добавляю следующую обработку исключений:
try {
// Oid mechanism = use Kerberos V5 as the security mechanism.
krb5Oid = new Oid( "1.2.840.113554.1.2.2");
Client client = new Client();
client.login( username, password);
}
catch (LoginException e) {
e.printStackTrace();
System.err.println( "There was an error during the JAAS login");
Throwable t = e.getCause();
if (t instanceof IOException) {
System.err.println( "Network issue");
} else if (t instanceof KrbException) {
System.err.println( "Kerberos issue");
} else if (t != null) {
System.err.println(t.getClass());
}
System.exit( -1);
}
В этом контексте KrbException
не может отличить неверное имя пользователя и пароль от недопустимой конфигурации клиента Kerberos в krb5.conf
или любых других параметрах, таких как сфера с ошибками.
Но благодаря IOException
, вы уверены в недоступности сервера ActiveDirectory, за исключением случаев, когда DNS-имя или IP-адрес неверны в настройках.
Так что, если ваша настройка верна и работает хотя бы для одного пользователя, вы получите IOException
какLoginException
причина, когда ActiveDirectory недоступен, и KrbException
для любой проблемы аутентификации, такой как неизвестное имя пользователя или неверный пароль.
Кстати, я согласен с вами, что обработка исключений является грубой, вероятно, потому что KerberosСама реализация стека выбрасывает KrbException
без дополнительных подробностей.
Если этот первый вариант не предоставляет достаточно подробностей с exЧто касается кода, вы должны создать свой собственный LoginModule, унаследованный от com.sun.security.auth.module.Krb5LoginModule
, чтобы вызвать другое исключение в соответствии с основной причиной.Я приглашаю вас прочитать последний исходный код OpenJDK Krb5LoginModule .