这是场景。我是在AD域中的Web服务器上运行的代码。有些客户与我有联系。如何在不让客户在浏览器中填写表单的情况下获取该客户的用户名?必须在Web服务器端使用Java技术。
编辑:
我最终使用了Spring Security Negotiate Filter,如下面的链接所述。有一个教程可用。在servlet中使用 request.getPrincipal()。getName()可以提供用户名。
答案 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)