如何保护Spring Security的ActiveDirectoryLdapAuthenticationProvider网络交互

时间:2015-07-26 06:47:55

标签: spring-security active-directory

从我自己检查的源代码和我到目前为止所阅读的所有内容中,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失败了(但我目前没有准确的信息;这是周末......道歉)。

我无法相信我是唯一一个有这种需求的人,那么有没有经验可以指引我走向'规范'的解决方案?

1 个答案:

答案 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的用户 然后验证传入的请求。 希望这会有所帮助。