Configuración Spring Security 2.04 para LDAP
Noviembre 17th, 2008
Por si te sirve de algo, me costo un monton, aun estoy detras de una configuración hibrida, medio LDAP medio Base de Datos, pero por ahora les dejo una configuración básica del LDAP con el Nuevo Acegi.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:s="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> <s:http> <s:intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <s:intercept-url pattern="/j_spring_security_switch_user" access="ROLE_SUPERVISOR" /> <s:intercept-url pattern="/web/**" access="ROLE_USER" /> <s:intercept-url pattern="/web/templates/**" access="ROLE_ADMIN" /> <s:intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <s:intercept-url pattern="/login.do" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <s:form-login login-page="/login.do" default-target-url='/web/index.do' authentication-failure-url="/login.do?login_error=1" /> <s:logout logout-success-url="/" /> <s:http-basic /> <s:anonymous /> <s:logout /> </s:http> <s:ldap-server id="ldapServer" url="ldap://localhost:389/ou=system" manager-dn="uid=admin,ou=system" manager-password="test" /> <!-- grop srch base was groups --> <s:ldap-authentication-provider server-ref="ldapServer" user-search-filter="sAMAccountName={0}" user-search-base="" group-role-attribute="cn" group-search-filter="memberOf={0}" group-search-base="ou=groups" /> <!-- sAMAccountName java.naming.referrel follow --> <bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> <constructor-arg value="ldap://localhost:389/ou=system" /> <property name="userDn" value="uid=admin,ou=system" /> <property name="password" value="test" /> </bean> <bean id="ldapAuthenticationProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider"> <constructor-arg> <bean class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator"> <constructor-arg ref="contextSource" /> <property name="userSearch" ref="userSearch" /> </bean> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator"> <constructor-arg ref="contextSource" /> <constructor-arg value="cn=users,dc=development,dc=somecompany,dc=com" /> <property name="convertToUpperCase" value="true" /> <property name="defaultRole" value="Authenticated" /> <property name="rolePrefix" value="" /> <property name="searchSubtree" value="true" /> <property name="groupSearchFilter" value="(memberUid={0})" /> <property name="groupRoleAttribute" value="cn" /> </bean> </constructor-arg> </bean> <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> <constructor-arg index="0" value="ou=Users" /> <constructor-arg index="1" value="(sAMAccountName={0})" /> <constructor-arg index="2" ref="contextSource" /> <property name="searchSubtree" value="true" /> </bean> </beans>



Hola,
muchas Gracias por compartir tus conocimientos, estoy probando tu ejemplo aunque aun no logro que funcione del todo ya que tengo muchas dudas.. no tendras algun ejemplo que me puedas pasar por favor?? lo que estoy intentando hacer es la validación de usuario en LDAP y el cambio de contraseña pero no mi configuracion que he puesto es muy basica
JAVA
ModificationItem[] mod = new ModificationItem[1];
mod[0] = new ModificationItem(LdapContext.REPLACE_ATTRIBUTE,
new BasicAttribute(”userPassword”,
userData.getNewPassword().getBytes()));
ldapTemplate.modifyAttributes(dn, mod);
XML
ldap://A2536DZ46286858
Veo que tu ejemplo tiene mas cosas (que no entiendo) y creo es lo que le falta a mi aplicacion..
Para mi login todo funciona perfecto.. el problema es con el cambio de password que si lo hace pero no se refresca hasta que se baja el server(Websphere) he visto que se soluciona con PasswordComparisonAuthenticator en lugar de BindAuthenticator … pero bueno esto muy complicado ya que apenas voy iniciando con spring…
Crees tener algun ejemplo o algo de información???
Muchas gracias, tu ejemplo que aqui publicas me sera de mucha utilidad
deberias poner todo el ejemplo…
ok… ya estoy cambiando mi configuración para dejarla como la que muestras en el ejemplo quedando de la siguiente manera
Estoy cambiando tambien el metodo que autentica (Pero creo que no paso bien los parametros como base, userDN… por que me genera el error 49)
public LDAPUser getAuthenticatedUser(final String user,
final String passwd, final Messages messages) {
Name dn = null;
List list = null;
LDAPUser ldapUser = null;
dn = buildDn(user, passwd);
LdapContextSource ldapContextSource = null;
ldapContextSource = (LdapContextSource) getLdapTemplate()
.getContextSource();
Object temp = null;
Authentication authentication = null;
List providersTemp = null;
LdapAuthenticationProvider authenticationProvider = null;
providersTemp = getAuthenticationManager().getProviders();
if ((providersTemp != null) && (providersTemp.size() > 0)) {
authenticationProvider = (LdapAuthenticationProvider) providersTemp.get(0);
authentication = authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken(
user, passwd));
temp = authentication.getPrincipal();
System.out.println(”temp ” + temp);
}
System.out.println(”pause”);
return ldapUser;
}
mi OpenDS esta estructurado de la siguiente manera
dc=example, dc=com
ou= People
uid = user1
uid = user2
uid = 123456
…
(Espero se vea el XML por que la vez pasada solo se mostro la URL)
Gracias …
<bean id=”authenticationManager” class=”org.springframework.security.providers.ProviderManager”>
<property name=”providers”>
<list>
<ref local=”ldapAuthenticationProvider”/>
</list>
</property>
</bean>
<bean id=”contextSource” class=”org.springframework.security.ldap.DefaultSpringSecurityContextSource”>
<constructor-arg value=”ldap://A2536DZ46286858″/>
<property name=”userDn” value=”uid=123456″/>
<property name=”password” value=”password”/>
</bean>
<bean id=”ldapAuthenticationProvider” class=”org.springframework.security.providers.ldap.LdapAuthenticationProvider”>
<constructor-arg>
<bean class=”org.springframework.security.providers.ldap.authenticator.PasswordComparisonAuthenticator”>
<constructor-arg><ref local=”contextSource”/></constructor-arg>
<property name=”userSearch” ref=”userSearch” />
</bean>
</constructor-arg>
<constructor-arg>
<bean class=”org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator”>
<constructor-arg><ref local=”contextSource”/></constructor-arg>
<constructor-arg><value></value></constructor-arg>
</bean>
</constructor-arg>
</bean>
<bean id=”userSearch”
class=”org.springframework.security.ldap.search.FilterBasedLdapUserSearch”>
<constructor-arg index=”0″ value=”ou=People,dc=example,dc=com” />
<constructor-arg index=”1″ value=”(objectclass=*)” />
<constructor-arg index=”2″ ref=”contextSource” />
<property name=”searchSubtree” value=”true” />
</bean>
<bean id=”ldapDAO”
class=”com…data.dao.impl.LdapDaoImpl”>
<property name=”ldapTemplate” ref=”ldapTemplate”/>
<property name=”authenticationManager” ref=”authenticationManager”/>
<property name=”readEnvironmetVariables” ref=”readEnvironmetVariables”/>
</bean>