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

时间:2011-04-28 22:55:36

标签: java spring spring-security single-sign-on windows-integrated-auth

这是场景。我是在AD域中的Web服务器上运行的代码。有些客户与我有联系。如何在不让客户在浏览器中填写表单的情况下获取该客户的用户名?必须在Web服务器端使用Java技术。

编辑:

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

http://waffle.codeplex.com/

5 个答案:

答案 0 :(得分:11)

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

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

SPNEGO的关键是设置自定义AuthenticationEntryPoint - 您需要使用自定义弹簧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位,请回复一些知识,例如您是否使用<http>命名空间样式与否。)

除了此选项之外,您还必须设置类似的SPNEGO身份验证类型(例如使用WAFFLE,如您所知) - other SO questions可以很好地解决这个问题。

最后,您可以将Tomcat与另一个支持SPNEGO或NTLM的Web服务器结合使用,例如Microsoft IIS或带有mod_spnego的Apache Web服务器。

希望其中一个想法适合你!

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

Windows执行此操作的最新方法是SPNEGO。要使其完全正常工作,您需要服务器在AD中拥有一个帐户,并与Kerberos进行通信。然后我被告知Spring Security支持这一点。

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

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

答案 3 :(得分:1)

如果您使用的是Tomcat,请使用WAFFLE

答案 4 :(得分:0)

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