Получить имя пользователя клиента, который подключился к веб-серверу - PullRequest
8 голосов
/ 29 апреля 2011

Вот сценарий.Я выполняю код на веб-сервере в домене AD.Какой-то клиент подключился ко мне.Как я могу получить имя пользователя этого клиента, не заставляя клиента заполнять форму в своем браузере?Необходимо использовать технологии Java на стороне веб-сервера.

edit:

В итоге я использовал фильтр согласования Spring Security, как описано ниже по ссылке.Доступен учебник.Использование request.getPrincipal (). GetName () из сервлета дает имя пользователя.

http://waffle.codeplex.com/

Ответы [ 5 ]

11 голосов
/ 05 мая 2011

Вам необходимо установить расширение Spring Security Kerberos - это единственный готовый способ выполнить то, что вы описываете в Spring Security 3. Это поддерживает согласование SPNEGO, но требует некоторого количества настройки на сервере (и знание того, как работает SPNEGO и Kerberos).

Не так много документации, но примеры приложений Майка, которые он поставляет с 1.0M2, хороши и охватывают большинство распространенных сценариев, включая автоматическую аутентификацию SPNEGO.

Ключевым моментом для SPNEGO является настройка пользовательского AuthenticationEntryPoint - вам нужно будет сделать это с помощью специального пружинного компонента следующим образом:

<bean id="kerbEntryPoint" class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" />

<bean id="kerbAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
</bean>

... кроме них требуются другие компоненты (опять же, обратитесь к примерам с расширением Kerberos). Отпишитесь, если вы продолжите знакомство с Spring Security или если вам нужны точные детали (так как в них вовлечено несколько бинов / конфигурационных битов, некоторые знания вашей конфигурации будут полезны, например, используете ли вы стиль пространства имен <http> или нет).

Кроме этой опции, вам придется настроить аналогичный тип аутентификации SPNEGO (например, использовать WAFFLE, как вы предлагаете) - другие вопросы SO достаточно хорошо это охватывают.

Наконец, вы могли бы настроить Tomcat на другой веб-сервер, который лучше поддерживает SPNEGO или NTLM, например Microsoft IIS или Apache Web Server с mod_spnego .

Надеюсь, одна из этих идей подойдет вам!

6 голосов
/ 05 мая 2011

Каким браузером пользуются ваши пользователи? Если IE; есть простое решение:

<html>
<script type="text/javascript">
var WinNetwork = new  ActiveXObject("WScript.Network");
alert(WinNetwork.UserName);
</script>
</html>
2 голосов
/ 29 апреля 2011

Последний способ сделать это для Windows - SPNEGO .Чтобы он работал полностью, вам нужен сервер, чтобы иметь учетную запись в AD и общаться с Kerberos.Тогда Spring Security, как мне сказали, поддерживает это.

Теперь не всегда нужно авторизовывать пользователей.Иногда (например, из-за статистики) достаточно получить идентификатор AD пользователя.Когда я играл со SPNEGO, двоичные данные, которые передавались из браузера, включали идентификатор пользователя в виде открытого текста.Он может быть извлечен оттуда, но, конечно, ему нельзя доверять.

NTLM устарел, считается менее безопасным и в основном выкатывается из сред.

1 голос
/ 10 мая 2011

Если вы используете Tomcat, тогда используйте WAFFLE .

0 голосов
/ 10 мая 2011

Могу поспорить, что вы можете установить веб-сервер Apache перед tomcat, чтобы apache мог проходить аутентификацию, используя NTLM или Kerberos .Затем вы можете использовать правила перезаписи для отправки запросов на tomcat с именем пользователя на равнине.Это просто идея, я не реализовал это сам.Однако мы используем проверку подлинности Apache Kerberos в нашей внутренней сети.Мое предложение не использовать NTLM, оно устаревшее и нестабильное.

...