当前位置: 首页 > 知识库问答 >
问题:

带有apacheds的active directory ldif文件示例

韦锦程
2023-03-14

这里有一个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
[...]

我需要修改这个工作示例,在这个示例中,user-search-criteria基于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示例中,他们使用“changeType:add”修改模式。但是,在users.ldif中添加此内容会导致错误,当读取一个已经包含更改的文件时,我们不能有条目。在gist示例中,它们提到要更新运行ldifde命令的模式。我应该如何修改ldap-xml项目来做到这一点?

我需要如何修改ldap-xml项目,以便我的users.ldif可以包含一个sAMAccountName属性?

共有1个答案

刘俊语
2023-03-14

在users.ldif文件的开头添加以下内容(它是Microsoft架构中包含sAMAccountName的最小片段):

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添加到person条目中:

[...]
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配置禁用了模式拦截器,因此默认情况下不会创建新的模式条目。我们可以通过创建解决此问题的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 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>
 类似资料:
  • ApacheDS (Apache Directory Server)的核心是目录服务,可以保存数据,并对不同类型的数据进行搜索操作。协议的实现在目录服务器顶层工作,提供与数据存储、搜索和检索有关的 Internet 服务。 ApacheDS 最重要的特性可能是利用不同协议公开目录服务的能力...

  • 我有一个问题,log4j没有登录到我的一个文件,我不知道为什么。我有一些运行脚本的代码,脚本可以添加日志记录,日志记录到使用log4j的文件中,我正在尝试创建一个只记录特定脚本的appender。 上面的appender可以工作,我在日志文件中得到了它 当脚本记录某些内容时,它会以这将使用my log4j中的上述配置显示在日志中。属性文件。 如果我将上述内容更改为: 文件中未记录任何内容。我本以为

  • 我试图为一个我目前正在工作的项目制作一个简单的REST API,以简化我每天必须做的任务,当我到达托管它的地方时,我遇到了一个500服务器的错误。查看(tomcat home dir)/logs/localhost.2021-10-22.log中的日志,我发现了这个错误: 我在这里还有“不存在”的类的代码: 我检查了这个类是否确实存在,尝试重新构建这些类,将其导入为未编译的文件,并使用web.xm

  • 我使用库Jaudiotagger创建了一个java类,它运行起来没有问题。然后我用它做了一个罐子,得到了noclassdefounderror。事情是这样的: 然后创建了清单和jar文件。 我得到了以下输出: 然后我运行jar文件,得到“A Java Exception has currence.”。我也试过: 我使用的是Windows8和最新的java(1.7.0_17)。

  • 问题内容: 文件孔是文件中的空白空间,但是不占用任何磁盘空间,并且包含空字节。因此,文件大小大于其在磁盘上的实际大小。 但是,我不知道如何创建带有文件孔的文件进行试验。 问题答案: 将命令与参数一起使用。 这会为您创建一个从字节8192到字节28671的漏洞。 这是一个示例,说明该文件确实存在漏洞(该命令告诉您文件正在使用多少磁盘块): 如您所见,带孔的文件尽管大小相同,但占用的磁盘块较少。 如果

  • 问题内容: 假设以下路由访问xml文件,以给定的xpath(?key =)替换特定标签的文本: 然后,我将使用cURL这样: xpath扩展应该访问标记以将其当前文本更改为“ John”。 我不知道如何实现这一目标,因为我才刚刚开始学习Flask和REST,在这种情况下我找不到很好的例子。另外,我想使用lxml来操纵xml文件,因为我已经知道了。 有人可以提供帮助并提供示例指导我吗? 问题答案: