2010-04-19 27 views
5

que actualmente han puesto mi contexto de autenticación LDAP así:primavera proveedor de autenticación LDAP personalizado de seguridad

<ldap-server url="ldap://host/dn" 
     manager-dn="cn=someuser" 
     manager-password="somepass" /> 
    <authentication-manager> 
     <ldap-authentication-provider user-search-filter="(samaccountname={0})"/> 
    </authentication-manager> 

Ahora, tengo que ser capaz de establecer un asignador de las autoridades aduaneras (que utiliza un servidor LDAP diferente) - así que estoy asumiendo que necesito configurar mi servidor LDAP similar a (http://static.springsource.org/spring-security/site/docs/2.0.x/reference/ldap.html):

<bean id="ldapAuthProvider" 
     class="org.springframework.security.providers.ldap.LdapAuthenticationProvider"> 
    <constructor-arg> 
    <bean class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator"> 
     <constructor-arg ref="contextSource"/> 
     <property name="userDnPatterns"> 
     <list><value>uid={0},ou=people</value></list> 
     </property> 
    </bean> 
    </constructor-arg> 
    <constructor-arg> 
    <bean class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator"> 
     <constructor-arg ref="contextSource"/> 
     <constructor-arg value="ou=groups"/> 
     <property name="groupRoleAttribute" value="ou"/> 
    </bean> 
    </constructor-arg> 
</bean> 

Pero,? ¿Cómo me refiero que 'ldapAuthProvider' al servidor LDAP en el contexto de seguridad?

También estoy usando resorte de seguridad 3, por lo que '' no existe ...

+0

Estaba bastante confundido cuando vi su pregunta principal y leí sus informaciones a continuación. Para mí, una ** Autenticación ** está conectada al nombre de usuario y la contraseña, mientras que, según tengo entendido, su problema real es ** Autorización **.Como las respuestas a continuación ya mencionan, el populador personalizado como este [descripción detallada de un populador personalizado] (http://stackoverflow.com/questions/34658534/spring-security-switch-to-ldap-authentication-and-database-authorities) . ¿Puede cambiar el texto a populator de autoridad en su lugar? :) – Dr4gon

Respuesta

5

Lo que he hecho para que sea el trabajo era simplemente añadir esto en el contexto de seguridad:

<authentication-manager> 
    <authentication-provider ref='ldapAuthProvider'/> 
</authentication-manager> 

Y entonces, la configuración de la judía 'ldapAuthProvider' como esto:

<bean id="contextSource" 
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldaps://url/dc=mock,dc=com" /> 
    <property name="userDn" value="cn=username,ou=People,dc=mock,dc=com" /> 
    <property name="password" value="password" /> 
</bean> 

<bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <constructor-arg> 
     <bean 
      class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
      <constructor-arg ref="contextSource" /> 
      <property name="userDnPatterns"> 
       <list> 
        <value>uid={0},ou=People</value> 
       </list> 
      </property> 
     </bean> 
    </constructor-arg> 
    <constructor-arg> 
     <bean 
      class="com.mock.MyCustomAuthoritiesPopulator"> 
     </bean> 
    </constructor-arg> 
</bean> 

Con la implementación de MyCustomAuthoritiesPopulator de la siguiente manera:

public class MyCustomAuthoritiesPopulator implements LdapAuthoritiesPopulator { 
    public Collection<GrantedAuthority> getGrantedAuthorities(
      DirContextOperations arg0, String arg1) {  
      ArrayList<GrantedAuthority> list = new ArrayList<GrantedAuthority>(); 
      list.add((new SimpleGrantedAuthority("ROLE_USER")); 
     return list;   
    } 
} 
5

Para la configuración de la primavera de registro es más simple si se utiliza una costumbre LdapUserDetailsMapper ya que hay un parámetro dedicado user-context-mapper-ref expuesta en <ldap-authentication-provider/> que le permite utilizar el estilo de configuración corta:

<authentication-manager> 
     <ldap-authentication-provider 
     user-search-filter="sAMAccountName={0}" 
     user-search-base="OU=Users" 
     group-search-filter="(&amp;(objectclass=group)(member={0}))" 
     group-search-base="OU=Groups" 
     user-context-mapper-ref="customUserContextMapper" /> 
    </authentication-manager> 

    <ldap-server url="ldap://url:389/DC=mock,DC=com" 
     manager-dn="manager" 
     manager-password="pass" /> 

Fuente: http://forum.springsource.org/showthread.php?118845-How-to-modify-Authority-after-loading-it-from-LDAP

En una nota lateral, yendo a la ruta LdapAuthoritiesPopulator también puede extender DeafultLdapAuthoritiesPopulator y anular getAdditionalRoles() en lugar de implementar la interfaz directamente.

public class MyCustomAuthoritiesPopulator extends 
     DefaultLdapAuthoritiesPopulator { 

    @Override 
    protected Set<GrantedAuthority> getAdditionalRoles(
      DirContextOperations user, String username) { 
     Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
       authorities.add((new SimpleGrantedAuthority("ROLE_USER")); 
     return authorities; 
    } 
+0

Gracias por la sugerencia de anular getAdditionalRoles. Pude recuperar grupos anidados de AD LDAP. Spring LDAP aparentemente no es compatible con esto. [Ejemplo CustomLdapAuthoritiesPopulator] (https://github.com/spring-projects/spring-security/issues/2053) –

0

Si quieres evitar las definiciones de frijol feos (DefaultSpringSecurityContextSource, LdapAuthenticationProvider, BindAuthenticator, ... + 100) y el uso de las definiciones "fresco" XML como

<authentication-manager> 
    <ldap-authentication-provider... /> 
</authentication-manager> 

Se puede utilizar un BeanPostProcessor . El siguiente ejemplo es un costumization de la GrantedAuthoritiesMapper en el AuthenticationProvider:

[context.xml]

<ldap-server id="ldapServer" url="${ldap.url}" manager-dn="${ldap.manager.dn}" manager-password="${ldap.manager.password}"/> 

<authentication-manager> 
    <ldap-authentication-provider user-search-filter="${ldap.userSearch.filter}" user-search-base="${ldap.searchBase}" 
     group-search-base="${ldap.groupSearchBase}"/> 
</authentication-manager> 

[UserGrantedAuthoritiesMapper.java]

package com.example.access.ldap; 

import java.util.Collection; 

import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; 
import org.springframework.stereotype.Component; 

@Component 
public class UserGrantedAuthoritiesMapper implements GrantedAuthoritiesMapper{ 

    public Collection<? extends GrantedAuthority> mapAuthorities(final Collection<? extends GrantedAuthority> authorities) { 
     ... 
     return roles; 
    } 
} 

[AuthenticationProviderPostProcessor.java ]

package com.example.access.ldap; 

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.config.BeanPostProcessor; 
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; 
import org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider; 
import org.springframework.stereotype.Component; 

@Component 
public class AuthenticationProviderPostProcessor implements BeanPostProcessor{ 

    @Autowired 
    private GrantedAuthoritiesMapper grantedAuthoritiesMapper; 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
     throws BeansException { 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) 
     throws BeansException { 
     if(bean != null && bean instanceof AbstractLdapAuthenticationProvider){ 
      setProviderAuthoritiesMapper((AbstractLdapAuthenticationProvider)bean); 
     } 
     return bean; 
    } 

    protected void setProviderAuthoritiesMapper(AbstractLdapAuthenticationProvider authenticationProvider){ 
     if(authenticationProvider != null){ 
      authenticationProvider.setAuthoritiesMapper(grantedAuthoritiesMapper); 
     } 
    } 
} 
Cuestiones relacionadas