在我们的Intranet中,所有用户都从Active Directory域登录Windows。我必须开发一个针对Active Directory验证用户的解决方案,该解决方案在Tomcat中运行,适用于Servlet和Axis2。
我已经能够使用基本的JavaSE手动验证身份验证。我还创建了一个测试Servlet,它从POST接收登录名和密码,并且也进行了身份验证,所以如果我至少使用HTTPS,我可以使用这个丑陋的解决方案。
我认为HTTP身份验证是最好的方法,因为它是HTTP标准,适用于Servlet和Axis2以及浏览器和任何类型的SOAP客户端。
对于浏览器,所需的行为是浏览器将打开登录模式窗口,用户将键入登录名和密码,我从Servlet中检索它们并验证AD。对于Axis2,客户端处理它设置HTTP标头的方式,我从使用Axis2用来创建WebService的类中检索它(如何做到这一点,我不知道,还没有搜索过......)并做同样的事情验证
问题在于我面临很多可能性,无法让它们发挥作用。大多数教程都使用conf/tomcat-users.xml
,从不给我密码。其他人使用NTLM或Kerberos,我已经尝试将spnego用于Servlet,它根本不起作用,而且它不适用于Axis2。我宁愿使用不需要第三方库的原生解决方案。
有关我可以从哪里开始的任何建议吗?
答案 0 :(得分:2)
您似乎不需要为用户进行单点登录。在这种情况下,您不需要NTLM或Kerberos。您只需要使用Active Directory进行服务器端身份验证。
幸运的是,AD将自己暴露为LDAP,但有一些怪癖。请查看此答案: Configuring Tomcat to authenticate using Windows Active Directory
如果您正确配置领域和容器(Tomcat)身份验证,您不需要检索标头或编写任何代码来进行身份验证 - 容器(Tomcat)将为您执行此操作。
编辑:
Web XML示例:
<security-constraint>
<web-resource-collection>
<web-resource-name>Wildcard means whole app</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
答案 1 :(得分:1)
Active Directory环境中唯一合理的方法是仅使用Kerberos。用户的最佳方法是Kerberos。如果您使用的是Tomcat 7,则内置支持。 Java 6拥有一切可以使它工作的东西。这就是我多年来所做的事情。