代码参考: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 !=
null
)
return
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,如需转载请自行联系原作者