Spring Security Custom провайдер аутентификации LDAP - PullRequest
5 голосов
/ 20 апреля 2010

У меня в настоящее время мой контекст аутентификации ldap настроен так:

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

Теперь мне нужно иметь возможность настроить собственный сопоставитель полномочий (он использует другой сервер ldap) - поэтому я предполагаю, что мне нужно настроить свой ldap-сервер аналогично (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>

Но как мне ссылаться на этот ldapAuthProvider на ldap-сервер в контексте безопасности?

Я также использую Spring-Security 3, поэтому '' не существует ...

Ответы [ 3 ]

5 голосов
/ 12 мая 2012

Для конфигурации пружины записи проще, если вы используете пользовательский LdapUserDetailsMapper, так как есть специальный параметр user-context-mapper-ref, выставленный на <ldap-authentication-provider/>, который позволяет вам использовать стиль короткой конфигурации:

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

Источник: http://forum.springsource.org/showthread.php?118845-How-to-modify-Authority-after-loading-it-from-LDAP

В дополнение к этому, следуя маршруту LdapAuthoritiesPopulator, вы также можете расширить DeafultLdapAuthoritiesPopulator и переопределить getAdditionalRoles() вместо непосредственной реализации интерфейса.

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;
    }
5 голосов
/ 07 июня 2010

Что я сделал, чтобы это работало, так это просто добавил это в контекст безопасности:

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

А затем, настраивая bean-компонент 'ldapAuthProvider' следующим образом:

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

С реализацией MyCustomAuthoritiesPopulator следующим образом:

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;        
    }
}
0 голосов
/ 17 мая 2013

Если вы хотите избежать уродливых определений bean-компонентов (DefaultSpringSecurityContextSource, LdapAuthenticationProvider, BindAuthenticator, ... + 100) и использовать «классные» определения xml, такие как

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

Вы можете использовать BeanPostProcessor . В следующем примере приведена калькуляция GrantedAuthoritiesMapper в 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...