【问题标题】:Spring security custom ldap authentication providerSpring Security 自定义 ldap 身份验证提供程序
【发布时间】:2011-02-09 21:46:52
【问题描述】:

我目前的 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 服务器) - 所以我假设我需要设置类似于 (http://static.springsource.org/spring-security/site/docs/2.0.x/reference/ldap.html) 的 ldap 服务器:

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

我也在用spring-security 3,所以''不存在...

【问题讨论】:

  • 当我看到你的标题问题并阅读下面的信息时,我很困惑。对我来说,Authentication 连接到用户名和密码,而据我了解,您的实际问题是 Authorisation。正如下面的答案已经提到了自定义填充器,例如这个detail description of a custom populator。您可以将文本更改为权限填充器吗? :)

标签: java authentication spring-security


【解决方案1】:

如果您想避免丑陋的 bean 定义(DefaultSpringSecurityContextSource、LdapAuthenticationProvider、BindAuthenticator、...+100)并使用“酷”的 xml 定义,例如

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

您可以使用 BeanPostProcessor。下面的例子是 AuthenticationProvider 中的 GrantedAuthoritiesMapper 的服装化:

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

【讨论】:

    【解决方案2】:

    如果您使用自定义 LdapUserDetailsMapper,则 Spring 配置会更简单,因为在 &lt;ldap-authentication-provider/&gt; 上公开了一个专用参数 user-context-mapper-ref,它允许您使用短配置样式:

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

    【讨论】:

    【解决方案3】:

    我所做的只是将它添加到安全上下文中:

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

    然后,像这样配置“ldapAuthProvider”bean:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2016-08-05
      • 2016-07-19
      • 2016-09-24
      • 2011-01-03
      • 2016-01-06
      • 2023-03-05
      相关资源
      最近更新 更多