Как использовать вход в Windows для единого входа и для записей Active Directory для настольного Java-приложения?

Я бы хотел, чтобы в моем настольном Java-приложении был единый вход для пользователей Active Directory. В два этапа я бы хотел:

  1. Убедитесь, что конкретный пользователь вошел в Windows с какой-либо пользовательской записью.
  2. Ознакомьтесь с некоторой информацией о настройке для этого пользователя в Active Directory.

С помощью Java: программный способ определения текущего пользователя Windows я могу получить имя текущего пользователя Windows, но могу ли я на это положиться? я думаю

System.getProperty("user.name")

не будет достаточно безопасно? ("user.name" похоже получено из переменных среды, так что я не могу полагаться на это, я думаю?)

Вопрос Проверка подлинности в Active Directory с помощью Java в Linux предоставляет мне аутентификация для данного имени + пароль, но я бы хотел пройти аутентификацию на основе входа в Windows?

Для доступа к Active Directory, вероятно, будет выбором LDAP?


person Touko    schedule 13.02.2009    source источник


Ответы (6)


Не поддерживается. В Java 6 есть улучшения, но пока их недостаточно.

У Java есть собственный стек GSS. Проблема в том, что для единого входа вам нужно получить билет Kerberos из ОС (а не из стека Java). В противном случае пользователь должен пройти аутентификацию второй раз (что противоречит цели единой регистрации).

См. http://java.sun.com/developer/technicalArticles/J2SE/security/. Найдите «Доступ к собственному GSS-API», и в нем говорится о новом системном свойстве sun.security.jgss.native, которое, когда установлено значение true, заставляет Java использовать базовую реализацию GSS ОС, предоставляя доступ к аутентификации на уровне ОС. Отлично! .... за исключением того, что он поддерживается только для Solaris и Linux, но не для Microsoft Windows.

Однако Java 6, похоже, имеет достаточную поддержку для работы в качестве сервера, получая запросы аутентификации SPNEGO от IE, а затем аутентифицируя этого пользователя в Active Directory. Это просто поддержка настольных клиентов, которая все еще не завершена.

person Alan Kent    schedule 06.10.2009
comment
Предоставляет ли какая-либо другая JVM доступ к билету Kerberos, как описано? - person Thorbjørn Ravn Andersen; 15.06.2010
comment
Однако похоже, что в Java 8 есть такая поддержка. docs.oracle.com/javase/ 8 / docs / technotes / guides / security / jgss / - person Ramiro; 15.12.2016

Используйте JAAS с LDAP LoginModule. Это позволит вам подключиться к базовой инфраструктуре безопасности Java.

Когда вам нужно перевести приложение в автономный режим или «отладить» приложение, вы можете легко заменить модуль LDAP на фиктивный модуль. Это позволяет вам продолжить тестирование своей «безопасности», не зависимо от Active Directory. Хорошо тестируемый, несвязанный, и вы можете использовать схему аутентификации в более позднее время почти без проблем.

person James Schek    schedule 13.02.2009
comment
Спасибо, это поддерживает аутентификацию при входе в Windows? (Чтобы, когда пользователь вошел в Windows, ему не нужно было отдельно вводить имя пользователя и пароль для Java-приложения) Сначала я этого не обнаружил, пришлось продолжать поиски. - person Touko; 16.02.2009
comment
Хм. Единственные модули, которые я видел, которые делают это, являются частью более крупной структуры, такой как WebLogic ... или предназначены для Java-клиента для передачи учетных данных на веб-сервер. Возможно, вам придется написать небольшой поставщик JAAS, используя собственные вызовы, чтобы сделать это надежно. - person James Schek; 17.02.2009
comment
Вместо использования LDAP LoginModule, Krb5LoginModule, похоже, может использовать кеш билетов ОС (учетные данные, полученные при входе в Windows) при использовании с параметром useTicketCache. Кажется, все еще есть некоторые проблемы, но пока это работает .. - person Touko; 23.06.2009

В проекте Waffle есть как клиентский, так и серверный код для выполнения единого входа в Windows. Он основан на JNA, нативных библиотек не требуется.

person dB.    schedule 15.11.2010

Проверьте jCifs на http://jcifs.samba.org/.

В остальном, придерживайтесь LDAP (на самом деле, это должна быть моя первая попытка, но ...)

person aldrinleal    schedule 13.02.2009

Рассматривали ли вы использование JNA api (позволяет легко выполнять собственные вызовы операционной системы)?

Вы можете вызвать документацию по методу win32 GetCurrentUser MSDN по адресу http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx. Он находится внутри Advapi32.dll.

У него также есть версия Unicode, GetCurrentUserW, если это необходимо.

И ты прав. Кажется, что переменную среды можно изменить, поэтому ее использование может ввести в заблуждение.

Я не уверен в кросс-платформенных последствиях для 32/64-битных окон. Если вам нужно решение в коде, я уверен, что смогу написать что-нибудь для него.

Но да, просто идея :)

person guyumu    schedule 13.02.2009

Вероятно, вы получите максимальную гибкость при использовании Spring Security. Вы можете использовать его как с аутентификацией JAAS, так и с LDAP.

person Bogdan    schedule 13.02.2009