问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

什么叫LDAP,LDAP服务器是什么?

发布网友 发布时间:2022-04-23 13:36

我来回答

4个回答

懂视网 时间:2022-05-02 01:02

代码参考:https://github.com/chocolateBlack/db2Ldap

QQ群:223460081


将关系型数据数据组织机构同步到LDAP中

1、获取关系型DB中组织机构关系

2、生成树型数据结构(因数据库不同,获取、生成树形结构方式不同)

3、按树形结构,自上而下向LDAP增加组织结构节点

4、获取关系型数据库中用户与组织机构关联关系。

5、LDAP增加用户节点


环境相关配置

applicationContext.xml 工程环境spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 2005-2013 the original author or authors.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:ldap="http://www.springframework.org/schema/ldap"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/ldap http://www.springframework.org/schema/ldap/spring-ldap.xsd">
       

    <context:property-placeholder location="classpath:/ldap.properties" system-properties-mode="OVERRIDE" ignore-unresolvable="true"/>
    <context:property-placeholder location="classpath:/db.properties" system-properties-mode="OVERRIDE" ignore-unresolvable="true"/>
    <context:annotation-config />

    <ldap:context-source id="contextSource"
                         password="${sample.ldap.password}"
                         url="${sample.ldap.url}"
                         username="${sample.ldap.userDn}"
                         base="${sample.ldap.base}" />

    <ldap:ldap-template id="ldapTemplate" context-source-ref="contextSource"/>

    <!--
        This will scan the org.springframework.ldap.samples.useradmin.domain package for interfaces
        extending CrudRepository (in our case, LdapRepository), automatically creating repository
        beans based on these interfaces.
    -->
    <ldap:repositories base-package="org.springframework.ldap.samples.useradmin.domain" />

    <!--
        This one will never be referenced directly, but the ldap:repositories tag will make sure
        it will be ‘wired in‘, because the GroupRepo interface extends from an interface that GroupRepoImpl
        imlements.
    -->
    <bean class="org.springframework.ldap.samples.useradmin.domain.impl.GroupRepoImpl" />
    <bean class="org.springframework.ldap.samples.useradmin.domain.impl.DepartmentRepoImpl" />
    <bean id="userService" class="org.springframework.ldap.samples.useradmin.service.UserService">
        <property name="directoryType" value="${sample.ldap.directory.type}" />
    </bean>
    <bean id="orgService" class="org.springframework.ldap.samples.useradmin.service.OrganizationService">
        <property name="directoryType" value="${sample.ldap.directory.type}" />
    </bean>

    <!-- Required to make sure BaseLdapName is populated in UserService -->
    <bean class="org.springframework.ldap.core.support.BaseLdapPathBeanPostProcessor" />

    <beans profile="no-apacheds">
        <!-- Populates the LDAP server with initial data -->
        <bean class="org.springframework.ldap.test.LdifPopulator">
            <property name="contextSource" ref="contextSource" />
            <property name="resource" value="classpath:/setup_data.ldif" />
            <property name="base" value="${sample.ldap.base}" />
            <property name="clean" value="${sample.ldap.clean}" />
            <property name="defaultBase" value="dc=example,dc=com" />
        </bean>
    </beans>
    
    
    <!--
        relational database configuration
    -->
    
    <beans>
      	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"/>
	    <bean id="dataSource" destroy-method="close"  
	        class="org.apache.commons.dbcp.BasicDataSource">  
	        <property name="driverClassName" value="${jdbc.driverClassName}" />  
	        <property name="url" value="${jdbc.url}" />  
	        <property name="username" value="${jdbc.username}" />  
	        <property name="password" value="${jdbc.password}" />  
	    </bean> 
    </beans>
    
    
</beans>

db.properties 关系型数据库相关配置

jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://192.168.10.10;database=hr_org
jdbc.username=hr
jdbc.password=hr

ldap.properties,LDAP相关配置

spring.profiles.active=no-apacheds
sample.ldap.url=ldap://192.168.14.5:389
sample.ldap.userDn=cn=Manager,dc=openldap,dc=jw,dc=cn
sample.ldap.password=G0qGH9Lsdf7e5oOcO9t
sample.ldap.base=dc=openldap,dc=jw,dc=cn
sample.ldap.directory.type=NORMAL

部分代码

    /**
     * 通过原生方式增加一个组织结构
     */
	@Test
	public void createNode(){
		Attributes attr = new BasicAttributes(); 
		BasicAttribute ocattr = new BasicAttribute("objectclass");
		ocattr.add("organizationalUnit");
		ocattr.add("top");
		attr.put(ocattr);
		ldapTemplate.bind("ou=业务", null, attr);
		ldapTemplate.bind("ou=事业部, ou=业务", null, attr);
		ldapTemplate.bind("ou=项目组,ou=事业部, ou=业务", null, attr);
	}


    /**
     * 通过原生方式添加User
     */
	@Test
	public void createU(){
		Attributes attr = new BasicAttributes(); 
		BasicAttribute ocattr = new BasicAttribute("objectclass");
		ocattr.add("top");
		ocattr.add("organizationalPerson");
		ocattr.add("shadowAccount");
		attr.put(ocattr);
		attr.put("userPassword", "12");
		attr.put("sn", "12");
		attr.put("uid", "12");
		
//		ldapTemplate.bind("ou=IT", null, attr);// buildDN() function
		ldapTemplate.bind("cn=123,ou=A项目组,ou=A事业部, ou=业务", null, attr);
	}
    /**
     * 通过Entity注解Java类的方式,增加一个组织机构,两种方式,一个通过orgService接口,另一个中直接通过ldapTemplate
     */
    @Test
	public void createOrganization(){
    	JWOrganization org = new JWOrganization();
    	org.setId("ou=1, ou=慧通事业部, ou=业务");
    	orgService.createJWOrg(org);
//		ldapTemplate.create(org);
	}	
	
	
    /**
     * 测试新增一个用户,并将该用户添加到某个Group中
     */
    @Test
	public void createUser(){
    	JWUser user = new JWUser();
    	user.setId("cn=111, ou=慧通事业部, ou=业务");
		user.setEmail("123@126.com");
		user.setEmployeeNumber("123");
		user.setLastName("lastName");
		user.setPhone("123");
		user.setTitle("title");
		user.setUid("ZH201703019");
		user.setUserPassword("c9c4c39a6ce3413ed32214ba89c1e777");
		
		userService.createJWUser(user);
		addMemberToGroup(user);
//		ldapTemplate.create(user);
	}


组织机构类JWOrganization

package org.springframework.ldap.samples.useradmin.domain;

import java.util.ArrayList;
import java.util.List;

import javax.naming.Name;

import org.springframework.data.domain.Persistable;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.DnAttribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import org.springframework.ldap.odm.annotations.Transient;
import org.springframework.ldap.support.LdapUtils;

/**
 * @author jgh
 */
@Entry(objectClasses = { "organizationalUnit",  "top"})
public final class JWOrganization implements Persistable<Name>{
	private static final long serialVersionUID = 1L;
	
	@Id
	private Name id;
	
    @Attribute(name = "ou")
    @DnAttribute(value="ou")
    private String fullName;
    
	@Transient
   	private String orgCode;
	@Transient
	private String orgName;
	@Transient
	private String orgParentCode;
	@Transient
	private String orgType;
	@Transient
	private List<JWOrganization> children = new ArrayList<JWOrganization>();
	
	public List<JWOrganization> getChildren() {
		return children;
	}
	public void setChildren(List<JWOrganization> children) {
		this.children = children;
	}
	
    public JWOrganization(String orgCode, String orgName,
			String orgParentCode, String orgType) {
		this.orgCode=orgCode;
		this.orgName=orgName;
		this.orgParentCode= orgParentCode;
		this.orgType=orgType;
		this.fullName = orgName;
	}

	public JWOrganization() {
		// TODO Auto-generated constructor stub
	}

    public void setId(Name id) {
        this.id = id;
    }
    
    public void setId(String id) {
        this.id = LdapUtils.newLdapName(id);
    }
	
	public String getOrgCode() {
		return orgCode;
	}

	public void setOrgCode(String orgCode) {
		this.orgCode = orgCode;
	}

	public String getOrgName() {
		return orgName;
	}

	public void setOrgName(String orgName) {
		this.orgName = orgName;
	}

	public String getOrgParentCode() {
		return orgParentCode;
	}

	public void setOrgParentCode(String orgParentCode) {
		this.orgParentCode = orgParentCode;
	}

	public String getOrgType() {
		return orgType;
	}

	public void setOrgType(String orgType) {
		this.orgType = orgType;
	}

	public String getFullName() {
		return fullName;
	}
	public void setFullName(String fullName) {
		this.fullName = fullName;
	}
	
	@Override
	public boolean isNew() {
//		Serializable id = getId();
//		return id == null || StringUtils.isBlank(String.valueOf(id));
		return true;
	}
	@Override
	public Name getId() {
		return this.id;
	}
	
}


用户类

/*
 * Copyright 2005-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.ldap.samples.useradmin.domain;

import javax.naming.Name;

import org.springframework.data.domain.Persistable;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.DnAttribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import org.springframework.ldap.support.LdapUtils;

/**
 * @author Mattias Hellborg Arthursson
 */
@Entry(objectClasses = { "inetOrgPerson", "organizationalPerson", "person", "top", "shadowAccount" })
public final class JWUser implements Persistable<Name>{
	private static final long serialVersionUID = 1L;

    @Id
    private Name id;
    
    @Attribute(name = "cn")
    @DnAttribute(value="cn")
    private String fullName;

    @Attribute(name = "employeeNumber")
    private String employeeNumber;

    @Attribute(name = "sn")
    private String lastName;

    @Attribute(name = "title")
    private String title;

    @Attribute(name = "mail")
    private String email;

    @Attribute(name = "telephoneNumber")
    private String phone;
    
    @Attribute(name = "uid")
    private String uid;
    
    @Attribute(name = "userPassword")
    private String userPassword;
    
    @Override
    public Name getId() {
        return id;
    }

    public void setId(Name id) {
        this.id = id;
    }

    public void setId(String id) {
        this.id = LdapUtils.newLdapName(id);
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmployeeNumber() {
        return employeeNumber;
    }

    public void setEmployeeNumber(String employeeNumber) {
        this.employeeNumber = employeeNumber;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUserPassword() {
		return userPassword;
	}

	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}

	@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        JWUser user = (JWUser) o;

        if (id != null ? !id.equals(user.id) : user.id != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }

	@Override
	public boolean isNew() {
		return true;
	}
}


本文出自 “巧克力黑” 博客,请务必保留此出处http://10120275.blog.51cto.com/10110275/1915562

将关系数据库中组织机构同步至LDAP中

标签:spring ldap

热心网友 时间:2022-05-01 22:10

LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。怎么使用LDAP这个术语呢?
在日常交谈中,你可能会听到有些人这么说:“我们要把那些东西存在LDAP中吗?”,或者“从LDAP数据库中取出那些数据!”,又或者“我们怎么把LDAP和关系型数据库集成在一起?”。严格地说,LDAP根本不是数据库而是用来访问存储在信息目录(也就是LDAP目录)中的信息的协议。更为确切和正式的说法应该是象这样的:“通过使用LDAP,可以在信息目录的正确位置读取(或存储)数据”。但是,也没有必要吹毛求疵,尽管表达得不够准确,我们也都知道对方在说什么。

热心网友 时间:2022-05-01 23:28

LDAP是基于TCP/IP协议的目录访问协议,是Internet上目录服务的通用访问协议。LDAP的出现简化了X.500目录的复杂度,降低了开发成本,是X.500标准的目录访问协议DAP的子集,同时也作为IETF的一个正式标准。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。
从上述定义不难看出LDAP是一个目录,那么该目录是如何出现,有什么用呢?
在当今的信息世界,网络为人们提供了丰富的资源。随着网络资源的日益丰富,迫切需要一种能有效管理资源信息并利于检索查询的服务技术。目录服务技术随之产生。
1.LDAP目录服务可以有效地解决众多网络服务的用户账户问题。
2.LDAP目录服务规定了统一的身份信息数据库、身份认证机制和接口,实现了资源和信息的统一管理,保证了数据的一致性和完整性。
3.LDAP目录服务是以树状的层次结构来描述数据信息的,此种模型适应了众多行业应用的业务组织结构。
LDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一种类型的数据库,但是不是关系型数据库。不象被设计成每分钟需要处理成百上千条数据变化的数据库,例如:在电子商务中经常用到的在线交易处理(OLTP)系统,LDAP主要是优化数据读取的性能。
LDAP最大的优势是:可以在任何计算机平台上,用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。

热心网友 时间:2022-05-02 01:03

差不多就是这个意思,写的很全面,不过像这个跟你说了,很专业,你要是没有系统的学习过,说了你也看不太明白吧
什么叫ldap,ldap服务器是什么?

LDAP是一种开放的标准协议,用于访问和查询目录服务中的信息。LDAP服务器则是运行此协议的服务器,主要用于存储和管理各种形式的目录信息。一、LDAP定义 LDAP是一种网络通信协议,它允许客户端应用程序访问和维护存储在LDAP服务器上的目录信息。这些目录通常包含用户信息、组织结构和资源列表等。由于LDAP协议的...

美国云服务器是什么?

美国云服务器是位于美国境内的云计算服务提供商所提供的云服务器服务。它们提供快速、可靠和安全的解决方案,通过互联网提计算资源和存储空间,使企业能够根据其业务需求调整其计算资源和硬件设备,是全球最大的云计算市场之一。美国云服务器,是云计算服务体系中的一项主机产品,该产品有效的解决了传统物理租机与VPS服务中,在实际应用中的云服务器具有很好的弹性能力:云服务器主机服务配置与业务规模可根据用户的需要进行配置,并可灵活的进行调整。如果您是想租美国服...

什么叫LDAP?LDAP服务器是什么?

LDAP是基于TCP/IP协议的目录访问协议,是Internet上目录服务的通用访问协议。LDAP的出现简化了X.500目录的复杂度,降低了开发成本,是X.500标准的目录访问协议DAP的子集,同时也作为IETF的一个正式标准。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。从上述定义不难...

ldap服务器是什么

LDAP服务器是一种目录服务协议服务器。LDAP,即轻型目录访问协议,是一种开放的标准,用于访问和查询目录服务中的信息。目录服务是一个特定类型的数据存储服务,类似于传统的电话簿或图书馆卡片目录,通过LDAP协议可以有效地组织和访问诸如用户信息、设备信息、配置数据等条目。LDAP服务器则是运行该协议的软件...

ldap服务器是什么

ldap服务器是轻量目录访问协议,它是基于X.500标准的,但是简单多了并且可以根据需要定制。LDAP的英文全称是LightweightDirectoryAccessProtocol,简称为LDAP。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPmanRFC网页中找到。现在...

ldap服务器有哪些

LDAP,即轻型目录访问协议,是一种开放标准的访问协议,用于在计算机网络中进行信息的读取和更新操作。下面列举一些常见的LDAP服务器:1.OpenLDAP。这是开源的LDAP服务,被广泛应用在各种类型的系统上。由于其源代码的开放性,用户可以根据自身需求进行定制。解释:OpenLDAP是LDAP协议的一个开源实现,可以在多...

ldap是什么

LDAP,全称为轻型目录访问协议,是一种开放的、跨平台的、基于客户端-服务器架构的协议。它主要用于查询目录服务中的信息。二、LDAP的应用场景 LDAP主要用于企业网络、互联网应用以及其他需要管理用户身份信息的场合。例如,在企业管理中,LDAP可以用来存储和管理员工信息、安全权限等。而在互联网应用中,它...

什么是LDAP服务器

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要...

LDAP是什么?

LDAP就是这么一个东西。从概念上说,LDAP分成了DN, OU等。OU就是一个树,DN就可以理解为是叶子,叶子还可以有更小的叶子。但是LDAP最大的分层按照IBM的文档是4层。还是上面这个例子,电话簿由电话公司进行维护,因此写是由他们去写,去组织。写完了,组织好了,就完成了,以后再写,再组织的次数是...

ldap是什么意思中文?

LDAP,全称为“Lightweight Directory Access Protocol”,是一种基于TCP/IP通信协议的目录服务协议。它是用于访问和维护分布式目录信息服务的标准协议,在企业和组织中被广泛使用。LDAP不仅仅是一种协议,它还包括对目录结构进行管理的标准方法和数据库操作方式,使得LDAP成为一套综合的目录服务系统。在企业级...

LDAP是什么?一文带你了解LDAP

LDAP必须知道的基本概念?上面我们知道基于LDAP协议做出来的产品有很多,我们以ActiveDirectory为例统一来看看LDAP我们需要知道哪些基本概念吧。ActiveDirectory见名知意,就是活动目录的意思。其中的重要概念有:DCDomainController就是域控制器,是非常核心的。其实他就是一台AD里的服务器,安装了活动目录的PC...

什么是服务器 服务器是什么东西 网络服务器是指什么 根服务器是什么 服务器出错是什么意思 无法连接到服务器是什么意思 服务器干什么用 什么情况下需要服务器 什么服务器
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么驾照包过都要去外地考 考驾照4月1日新规取消考长途吗 减肥喝乌龙茶好还是普洱茶好原来都是这样瘦身的!! 有木有宝妈喝过普洱茶和黑乌龙茶,哪个减肥效 电脑内怎么将SmartArt图形插入至word文档内 xo型腿如何矫正才有效 法国的奢侈品价格比国内如何? 哪些奢侈品是法国的 哪个国家卖奢侈品便宜 法国站怎么样 如何关联ldap服务器实现登录认证 关于用ASP实现 LDAP建立统一身份验证技术! 为什么要使用IBM Ldap呢?它和Window的AD有什么区别? 怎么配置solaris使用ldap进行用户认证 用LDAP服务器来作用户权限认证有什么优势?相比单纯用数据库来存储用户信... php ldap 用户认证的问题 为什么要使用IBM Ldap,它和Window的AD有什么区别? LDAP是什么意思? Windows综合认证与LDAP认证有什么区别 蟹兴阁阳澄湖大闸蟹怎么辨别真伪? 正宗阳澄湖大闸蟹怎么辨别呢,都说是阳澄湖的,可阳澄湖就那么大,想买真的该怎么选择呢? 新鲜的螃蟹怎么做? 努比亚Z17畅享版和旗舰版有什么区别 怎么样辨别真假阳澄湖大闸蟹 努比亚z17耗电快吗 怎么设别阳澄湖大闸蟹真假? z17mini耗电快? 努比亚Z17mini电池容量多少 努比亚z177iite手机如何 阳澄湖大闸蟹真伪如何辨别? ldap管理域的验证方式有哪些 LDAP认证——如何构造bind DN 单点登录:公司已经有了AD&#47;open ldap&#47;某个认证源,为什么还需要玉符? 乐理知识的视频课哪家最好? 哪里有网上的乐理课程? 网上哪里的幼儿园的课程比较好? 哪里有专业的线上乐理课? 有什么好的学乐理知识的课程推荐? 有专门学习钢琴乐理知识的线上培训班吗? 音乐乐理网课找人代修,有人推荐吗? 如何创建 SVN 服务器,并搭建自己的 SVN 仓库 有没有比较好的基础乐理知识的课程? 在哪个网站可以学习乐理知识? 求讲乐理知识基础知识的网站和好的教材. 怎么搭建本地SVN服务 李重光的《乐理基础知识》在哪里能下到 请问怎么在网上学习音乐乐理知识? 一个外地人想要在南京买房,需要做那些准备? 给我介绍一个好一点的乐理知识的教学视频。最好系统些 基本乐理课程资料哪里有?