5 Stimmen

Spring security benutzerdefinierter ldap-authentifizierungsanbieter

Ich habe derzeit meine ldap-Authentifizierung Kontext wie folgt eingerichtet:

    <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> 

Nun muss ich in der Lage sein, einen benutzerdefinierten Behörden-Mapper einzurichten (er verwendet einen anderen ldap-Server) - ich nehme also an, dass ich meinen ldap-Server ähnlich einrichten muss wie ( 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>

Aber wie referenziere ich diesen "ldapAuthProvider" auf den ldap-Server im Sicherheitskontext?

Ich verwende auch spring-security 3, also gibt es '' nicht...

0 Stimmen

Ich war ziemlich verwirrt, als ich Ihre Frage in der Überschrift sah und Ihre Informationen unten las. Für mich ein Authentifizierung mit dem Benutzernamen und dem Kennwort verbunden ist, während das eigentliche Problem meines Erachtens darin besteht Autorisierung . Wie Antworten unten bereits erwähnt den benutzerdefinierten Populator wie diese detaillierte Beschreibung eines benutzerdefinierten Populators . Kannst du den Text vielleicht stattdessen in Behörden-Populator ändern? :)

5voto

Carlos Punkte 51

Damit das funktioniert, habe ich dies einfach in den Sicherheitskontext eingefügt:

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

Und dann konfigurieren Sie die Bean "ldapAuthProvider" wie folgt:

<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>

Mit der Implementierung von MyCustomAuthoritiesPopulator wie folgt:

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;        
    }
}

5voto

Tomasz Punkte 4911

Die Federkonfiguration ist übrigens einfacher, wenn Sie eine benutzerdefinierte LdapUserDetailsMapper da es einen eigenen Parameter gibt user-context-mapper-ref ausgesetzt am <ldap-authentication-provider/> die es Ihnen ermöglicht, den kurzen Konfigurationsstil zu verwenden:

  <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" />

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

Nebenbei bemerkt, der Weg über die LdapAuthoritiesPopulator Route können Sie auch erweitern DeafultLdapAuthoritiesPopulator und außer Kraft setzen getAdditionalRoles() anstatt die Schnittstelle direkt zu implementieren.

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;
    }

0voto

alexfdz Punkte 405

Wenn Sie hässliche Bean-Definitionen (DefaultSpringSecurityContextSource, LdapAuthenticationProvider, BindAuthenticator,...+100) vermeiden und "coole" Xml-Definitionen verwenden wollen wie

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

Sie können eine BeanPostProcessor . Das folgende Beispiel ist eine Anpassung des GrantedAuthoritiesMappers im 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);
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X