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

QQ群:223460081


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

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

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

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

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

5、LDAP增加用户节点


环境相关配置

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?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 关系型数据库相关配置

1
2
3
4
jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://192.168.10.10;database=hr
jdbc.username=admin
jdbc.password=admin

ldap.properties,LDAP相关配置

1
2
3
4
5
6
spring.profiles.active=no-apacheds
sample.ldap.url=ldap://192.168.14.50:389
sample.ldap.userDn=cn=Manager,dc=openldap,dc=jw,dc=cn
sample.ldap.password=G0qGH9123
sample.ldap.base=dc=openldap,dc=jw,dc=cn
sample.ldap.directory.type=NORMAL

部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    /**
     * 通过原生方式增加一个组织结构
     */
    @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);
    }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    /**
     * 通过原生方式添加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);
    }
1
2
3
4
5
6
7
8
9
10
11
12
    /**
     * 通过Entity注解Java类的方式,增加一个组织机构,两种方式,一个通过orgService接口,另一个中直接通过ldapTemplate
     */
    @Test
    public void createOrganization(){
        JWOrganization org = new JWOrganization();
        org.setId("ou=1, ou=事业部, ou=业务");
        orgService.createJWOrg(org);
//      ldapTemplate.create(org);
    }  
     
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    /**
     * 测试新增一个用户,并将该用户添加到某个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("123");
        user.setUserPassword("c9c4c39a6ce34112314ba89c1e777");
         
        userService.createJWUser(user);
        addMemberToGroup(user);
//      ldapTemplate.create(user);
    }


组织机构类JWOrganization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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;
    }
     
}


用户类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * 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 != nullreturn false;
 
        return true;
    }
 
    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
 
    @Override
    public boolean isNew() {
        return true;
    }
}

     本文转自巧克力黒 51CTO博客,原文链接:http://blog.51cto.com/10120275/1915562,如需转载请自行联系原作者