Cómo hacer la contraseña de Spring Security MD5 antes de llamar a LDAP

Estoy trabajando en un proyecto que usa Spring y Spring Security con LDAP. Mi proyecto funcionaba muy bien con LDAP antes de que MD5 usara las contraseñas de usuario. Ahora que tenemos MD5 las contraseñas de los usuarios, estoy tratando de encontrar una manera en Spring XML para decirle a Springs a MD5 la contraseña antes de verificar LDAP.

A continuación se muestra mi XML

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/jdbc
           http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true" use-expressions='true'>
        <intercept-url pattern="/friends/**" access="isAuthenticated()" />
        <intercept-url pattern="/articles/**" access="isAuthenticated()" />
    </http>

    <authentication-manager>
        <ldap-authentication-provider
            user-search-filter="(uid={0})" user-search-base="ou=sampleusers" />
    </authentication-manager>


    <beans:bean id="contextSource"
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
        <beans:constructor-arg value="ldap://localhost:389/dc=xxxwf,dc=org" />
        <beans:property name="userDn" value="cn=admin,dc=xxxwf,dc=org" />
        <beans:property name="password" value="sabrina123" />
    </beans:bean>
    <beans:bean id="ldapAuthProvider"
        class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
        <beans:constructor-arg>
            <beans:bean
                class="org.springframework.security.ldap.authentication.BindAuthenticator">
                <beans:constructor-arg ref="contextSource" />
                <beans:property name="userDnPatterns">
                    <beans:list>
                        <beans:value>uid={0},ou=sampleusers</beans:value>
                    </beans:list>
                </beans:property>
        </beans:constructor-arg>

    </beans:bean>
    <ldap-server url="ldap://127.0.0.1:389/dc=xxxwf,dc=org" />

    <beans:bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <beans:property name="location" value="classpath:jdbc.properties" />


    </beans:bean>
    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <beans:property name="driverClassName" value="${database.driver}" />
        <beans:property name="url" value="${database.url}" />
        <beans:property name="username" value="${database.user}" />
        <beans:property name="password" value="${database.password}" />
        <beans:property name="initialSize" value="5" />
        <beans:property name="maxActive" value="10" />
    </beans:bean>
</beans:beans>

preguntado el 08 de noviembre de 11 a las 16:11

3 Respuestas

Las contraseñas deben enviarse sin cifrar a través de una conexión segura, no deben estar precodificadas con resumen ni precodificadas de ninguna manera; las contraseñas precodificadas evitan que el servidor de directorio realice controles de calidad de contraseñas. El servidor de directorio cifra o codifica la contraseña de texto sin cifrar y compara la contraseña con la que está cifrada / codificada en la entrada de destino y devuelve éxito o error en la respuesta de vinculación.

respondido 08 nov., 11:23

Prueba esto:

<security:authentication-manager>
        <security:ldap-authentication-provider>
        <security:password-compare>
            <security:password-encoder ref="passwordEncoder">
            </security:password-encoder>
        </security:password-compare>
    </security:ldap-authentication-provider>
</security:authentication-manager>

<bean id="passwordEncoder" 
      class="org.springframework.security.authentication.encoding.Md5PasswordEncoder">
</bean>

No lo he probado con LDAP. Pero funciona perfectamente para el proveedor de autenticación "normal" (no LDAP).

respondido 08 nov., 11:21

La respuesta de Terry es correcta, si está utilizando la autenticación de enlace, el cliente LDAP de Spr Sec está intentando enlazarse a LDAP utilizando el nombre de usuario y la contraseña de texto sin formato proporcionados (por cierto, esta es la razón por la que siempre se recomienda SLDAP si está utilizando la autenticación de enlace).

Si está utilizando la autenticación de comparación de contraseñas, la contraseña que está utilizando para comparar debe tener hash o codificar para que coincida exactamente con la contraseña almacenada en el repositorio LDAP.

Dado que parece que está utilizando la autenticación de enlace, debería estar bien tal como están las cosas actualmente.

Estos conceptos están bastante bien cubiertos en la Sección LDAP del manual.

respondido 09 nov., 11:21

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.