从我自己检查的源代码和我到目前为止所阅读的所有内容中,Spring Security的ActiveDirectoryLdapAuthenticationProvider(http://docs.spring.io/spring-security/site/docs/3.2.8.RELEASE/reference/htmlsingle/#ldap-active-directory)与ActiveDirectory“明确地”进行交互...密码是使用纯文本传输的。
我看到How does Spring Security LDAP protect password during Active Directory authentication?等问题,但这只能证实我的担忧。我的google-fu还不够好,我还没有找到一个明确的解决方案。
我正在使用一种能够显着加强安全性的实用程序,我不相信我目前使用的ActiveDirectoryLdapAuthenticationProvider(使用明文密码)可以接受更长时间。
我目前使用AD对用户进行身份验证,并验证所呈现的用户是否已被授予角色,以便他们使用发出请求的应用程序。
(如果必须的话,我不会超越Spring Security,但我强烈怀疑,如果我把它带给他们,我的经理的恐惧因素会大大增加,所以我正在寻找一个微小的改变,如果是这样的话尽可能......)
我相信AD实例是Windows Server 2008 R2。
我正在使用ldap:// ...:389。我尝试使用ldaps:// ...:636失败了(但我目前没有准确的信息;这是周末......道歉)。
我无法相信我是唯一一个有这种需求的人,那么有没有经验可以指引我走向'规范'的解决方案?
答案 0 :(得分:0)
使用了spring-ldap模块来满足您的要求。 我做的是:
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<constructor-arg ref="contextSource" />
</bean>
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="--ldaps url goes here" />
<property name="userDn"
value="--user dn goes here" />
<property name="password"
value="--password goes here" />
</bean>
在其中一个服务类中自动连接ldapTemplate。 有一个看起来像这样的方法:
public boolean authenticate(final String username, final String password)
throws MyException {
//searchAttribute is bean attribute here
final String searchQuery = "(" + searchAttribute + "=" + username + ")";
boolean status = false;
AuthenticationErrorCallback callback = new SpringLdapAuthenticationErrorCallback();
try {
status = ldapTemplate.authenticate(basePath, searchQuery, password,
callback);
if (!status) {
LOGGER.error("Error while ldap authencation" + callback);
throw new MyException(
ErrorEnum.INVALID_USER.getCode(),
ErrorEnum.INVALID_USER.getDescription());
}
} catch (Exception ex) {
LOGGER.error("Error while ldap authencation" + ex);
throw new MyException(ErrorEnum.INVALID_USER.getCode(),
ErrorEnum.INVALID_USER.getDescription());
}
return status;
使用ldaps时,您应该注意将ldap服务器证书添加到您的信任库。由于大部分时间都是自签名证书。 还要检查服务器是否支持匿名身份验证。 如果没有,那么你将需要一个首先绑定到ldap的用户 然后验证传入的请求。 希望这会有所帮助。