带有 apacheds 的示例活动目录 ldif 文件
Posted
技术标签:
【中文标题】带有 apacheds 的示例活动目录 ldif 文件【英文标题】:sample active directory ldif file with apacheds 【发布时间】:2014-06-21 20:55:08 【问题描述】:这里有一个 spring-security 示例,ldap-xml,它运行一个 ldap 服务器并导入一个 LDIF 文件进行测试:
https://github.com/spring-projects/spring-security/blob/master/samples/ldap-xml/src/main/webapp/WEB-INF/applicationContext-security.xml
[...]
<s:ldap-server ldif="classpath:users.ldif" port="33389"/>
<s:authentication-manager>
<s:ldap-authentication-provider
group-search-filter="member=0"
group-search-base="ou=groups"
user-search-base="ou=people"
user-search-filter="uid=0"
/>
<s:authentication-provider ref='secondLdapProvider' />
</s:authentication-manager>
[...]
https://github.com/spring-projects/spring-security/blob/master/samples/ldap-xml/src/main/webapp/WEB-INF/classes/users.ldif
[...]
dn: uid=rod,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Rod Johnson
sn: Johnson
uid: rod
userPassword: koala
[...]
我需要修改这个工作示例,其中用户搜索条件基于 sAMAccountName 而不是 uid。我修改 users.ldif 如下:
[...]
dn: cn=rod,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Rod Johnson
sn: Johnson
sAMAccountName: rod
userPassword: koala
[...]
但 apacheds 在导入 users.ldif 时显示警告:
OID for name 'samaccountname' was not found within the OID registry
看来我需要通过修改 LDAP 模式来添加这个新属性 sAMAccountName。如何在 ldap-xml 示例中做到这一点?
在这个gist example 中,他们使用“changetype: add”修改架构。但是在 users.ldif 中添加它会导致错误 We cannot have entries when reading a file which already contains changes
。在 gist 示例中,他们提到更新运行 ldifde
command 的模式。我应该如何修改ldap-xml 项目来做到这一点?
我需要如何修改 ldap-xml 项目,以便我的 users.ldif 可以包含 sAMAccountName 属性?
【问题讨论】:
只是为了确保我理解您的问题(严格来说,这与 Spring Security 无关) - 您正在寻求了解如何获取在 ApacheDS 中配置的自定义 LDAP 模式元素 (sAMAccountName)服务器,对吗? 正确。如何在 spring-security 框架中做到这一点。 spring-security 可以轻松嵌入 ldap 服务器并导入带有 s:ldap-server 标签的 ldif 文件。如何在 spring-security 框架中获取自定义 ldap 模式元素。 @DavidPortabella 你解决了这个问题吗? 【参考方案1】:在 users.ldif 文件的开头添加以下内容(这是包含 sAMAccountName 的 Microsoft 架构的最小片段):
dn: cn=microsoft, ou=schema
objectclass: metaSchema
objectclass: top
cn: microsoft
dn: ou=attributetypes, cn=microsoft, ou=schema
objectclass: organizationalUnit
objectclass: top
ou: attributetypes
dn: m-oid=1.2.840.113556.1.4.221, ou=attributetypes, cn=microsoft, ou=schema
objectclass: metaAttributeType
objectclass: metaTop
objectclass: top
m-oid: 1.2.840.113556.1.4.221
m-name: sAMAccountName
m-equality: caseIgnoreMatch
m-syntax: 1.3.6.1.4.1.1466.115.121.1.15
m-singleValue: TRUE
dn: ou=objectclasses, cn=microsoft, ou=schema
objectclass: organizationalUnit
objectclass: top
ou: objectClasses
dn: m-oid=1.2.840.113556.1.5.6, ou=objectclasses, cn=microsoft, ou=schema
objectclass: metaObjectClass
objectclass: metaTop
objectclass: top
m-oid: 1.2.840.113556.1.5.6
m-name: securityPrincipal
m-supObjectClass: top
m-typeObjectClass: AUXILIARY
m-must: sAMAccountName
[rest of users.ldif]
现在将新的 objectClass 添加到人员条目中:
[...]
dn: cn=rod,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: securityPrincipal <--- new objectClass
cn: Rod Johnson
sn: Johnson
sAMAccountName: rod
userPassword: koala
[...]
只有新条目是不够的。 Spring Security 中的 ApacheDS 配置有 disabled schema interceptor,因此默认情况下不会创建新的模式条目。我们可以通过创建修复此问题的 BeanPostProcessor 来打开它:
package com.example.test.spring;
import java.util.List;
import org.apache.directory.server.core.interceptor.Interceptor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.security.ldap.server.ApacheDSContainer;
import static org.springframework.util.CollectionUtils.isEmpty;
public class ApacheDSContainerConfigurer implements BeanPostProcessor
private List<Interceptor> interceptors;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
if (bean instanceof ApacheDSContainer)
ApacheDSContainer dsContainer = ((ApacheDSContainer) bean);
setInterceptorsIfPresent(dsContainer);
return bean;
private void setInterceptorsIfPresent(ApacheDSContainer container)
if (!isEmpty(interceptors))
container.getService().setInterceptors(interceptors);
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
return bean;
public void setInterceptors(List<Interceptor> interceptors)
this.interceptors = interceptors;
我们必须在应用程序上下文中注册和配置 bean:
<bean class="com.example.test.spring.ApacheDSContainerConfigurer">
<property name="interceptors">
<list>
<bean class="org.apache.directory.server.core.normalization.NormalizationInterceptor"/>
<bean class="org.apache.directory.server.core.authn.AuthenticationInterceptor"/>
<bean class="org.apache.directory.server.core.referral.ReferralInterceptor"/>
<!--<bean class="org.apache.directory.server.core.authz.AciAuthorizationInterceptor"/>-->
<!--<bean class="org.apache.directory.server.core.authz.DefaultAuthorizationInterceptor"/>-->
<bean class="org.apache.directory.server.core.exception.ExceptionInterceptor"/>
<!--<bean class="org.apache.directory.server.core.changelog.ChangeLogInterceptor"/>-->
<bean class="org.apache.directory.server.core.operational.OperationalAttributeInterceptor"/>
<bean class="org.apache.directory.server.core.schema.SchemaInterceptor"/>
<bean class="org.apache.directory.server.core.subtree.SubentryInterceptor"/>
<!--<bean class="org.apache.directory.server.core.collective.CollectiveAttributeInterceptor"/>-->
<!--<bean class="org.apache.directory.server.core.event.EventInterceptor"/>-->
<!--<bean class="org.apache.directory.server.core.trigger.TriggerInterceptor"/>-->
<!--<bean class="org.apache.directory.server.core.journal.JournalInterceptor"/>-->
</list>
</property>
</bean>
它现在应该可以工作了。
【讨论】:
【参考方案2】:我也遇到了同样的问题,并尝试了@Karol 给出的解决方案,但它对我不起作用。
我使用 Spring Framework 提供的LdapTemplate
来访问 Ldap 服务器。
问题是 嵌入式 ldap 服务器(在我的例子中是 ApacheDS)不支持某些 属性,例如 sAMAccountName
.作为测试的解决方案,我在代码中使这些属性名称可从 properties 文件 进行配置,并将属性名称替换为测试环境属性文件中 ApacheDS 嵌入式服务器中可用的名称。它就像一个魅力。
例如,在实际环境中,LdapTemplate 的搜索是基于sAMAccountName
属性的,而在测试环境中,搜索是基于uid
属性的。
【讨论】:
奇怪的是它没有工作。在我的情况下也是 ApacheDS,我提供的解决方案只是在模式中注册 sAMAccountName 属性。也许你不小心错过了一些步骤。您的替代方案看起来也不错。以上是关于带有 apacheds 的示例活动目录 ldif 文件的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse 上带有 Dataflow Runner 的 Apache Beam MinimalWordcount 示例