获取连接到 Web 服务器的客户端的用户名

Posted

技术标签:

【中文标题】获取连接到 Web 服务器的客户端的用户名【英文标题】:Get username of client who connected to web server 【发布时间】:2011-08-15 02:54:10 【问题描述】:

这是场景。我是在 AD 域中的 Web 服务器上运行的代码。一些客户已连接到我。如何在不让客户在浏览器中填写表格的情况下获得该客户的用户名?必须在 Web 服务器端使用 Java 技术。

编辑:

我最终使用了 Spring Security Negotiate Filter,如下面的链接所述。有一个教程可用。在 servlet 中使用 request.getPrincipal().getName() 可以得到用户名。

http://waffle.codeplex.com/

【问题讨论】:

@DA.. :) .. 顺便说一句,原因是我使用的是 tomcat 和 spring。 没有用户名。除非您在 AD 域中,否则您的请求本质上是没有意义的。 @Slaks 我在 AD 域中。很抱歉没有包含这些重要信息。 您需要设置 NTLM 身份验证。我不知道如何在 Tomcat 中做到这一点。 问题被标记为“spring-security”。你用它来认证吗? 【参考方案1】:

您需要设置Spring Security Kerberos extension - 这是您在 Spring Security 3 中描述的唯一开箱即用的方法。这支持 SPNEGO 协商,但需要在服务器上进行一些设置(和SPNEGO 和 Kerberos 如何工作的知识)。

文档不多,但 Mike 随 1.0M2 提供的示例应用程序非常棒,涵盖了大多数常见场景,包括自动 SPNEGO 身份验证。

SPNEGO 的关键是设置自定义 AuthenticationEntryPoint - 您需要使用自定义 spring bean 执行此操作,如下所示:

<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>

...除了这些之外,还需要更多的 bean(同样,请参阅带有 Kerberos 扩展的示例)。如果您进一步了解 Spring Security 或者如果您想要确切的详细信息(因为涉及到许多 bean / config 位,一些有关您的配置的知识会很有帮助,例如您是否使用 &lt;http&gt; 命名空间样式与否)。

除此选项外,您还必须设置类似类型的 SPNEGO 身份验证(如您所建议的使用 WAFFLE)-other SO questions 很好地涵盖了这一点。

最后,您可以在 Tomcat 前面加上另一个支持 SPNEGO 或 NTLM 更好的 Web 服务器,例如 Microsoft IIS 或带有mod_spnego 的 Apache Web Server。

希望这些想法中的一个对您有用!

【讨论】:

谢谢彼得。我更喜欢使用或不使用 Kerberos 的 Waffle 等解决方案,所以我想我会坚持下去。无论如何,感谢您的帮助和链接。 澄清一下 - 如果您在描述的 AD 域中,您可能已经在运行 Kerberos - W2K3 及更高版本通常默认启用它。【参考方案2】:

您的用户使用什么浏览器?如果是 IE;有一个简单的解决方案:

<html>
<script type="text/javascript">
var WinNetwork = new  ActiveXObject("WScript.Network");
alert(WinNetwork.UserName);
</script>
</html>

【讨论】:

谢谢,但就像我说的“必须在 Web 服务器端使用 Java 技术”。 JS 不会削减它,因为有动力的用户可以向我发送他们想要的任何用户名。无论如何都要投赞成票。 我想象在受控环境中你不会激励用户,无论如何,谢谢你的支持。 你是对的 - 我怀疑我的环境中的用户会尝试(甚至不知道如何)这样做 - 但我非常谨慎,为了学习。 我明白了。请在此处发布您的最终解决方案,我会非常好奇 - 为了学习。 你的评论让我崩溃了。它让我想起了 SQ3 的立方体农场。【参考方案3】:

Windows 的最新方法是SPNEGO。为了使其充分发挥作用,您需要您的服务器在 AD 中拥有一个帐户,并与 Kerberos 通信。然后有人告诉我,Spring Security 支持这一点。

现在,您并不总是需要授权用户。有时(例如出于统计原因)获取用户的 AD id 就足够了。当我在玩 SPNEGO 时,从浏览器传递的二进制数据以明文形式包含用户 ID。它可以从那里提取,但当然不能信任。

NTLM 已过时,被认为不太安全,并且主要从环境中推出。

【讨论】:

我不需要对用户进行身份验证,只需按照您所说的查看他们的用户名或“AD Id”即可。【参考方案4】:

如果您使用的是 Tomcat,则使用WAFFLE。

【讨论】:

【参考方案5】:

我敢打赌,你可以将 Apache Web 服务器放在 tomcat 前面,这样 apache 就可以使用 NTLM 或 Kerberos 进行身份验证。然后您可以使用重写规则将请求发送到带有普通用户名的tomcat。这只是一个想法,我自己还没有实现。但是,我们在 Intranet 中使用 Apache Kerberos 身份验证。我的建议是不要使用 NTLM,它已经过时且不稳定。

【讨论】:

以上是关于获取连接到 Web 服务器的客户端的用户名的主要内容,如果未能解决你的问题,请参考以下文章

是否有可以连接到 ejabberd 的 AJAX Web 客户端?

如何找到连接到服务器的客户端的 IP 地址?

服务器无法连接到客户端的发射

获取连接到 SignalR 集线器的侦听器和客户端的数量

来自连接到 Node.js API 的移动客户端的社交身份验证

Spring和Android客户端的登录问题