将关系数据库中组织机构同步至LDAP中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将关系数据库中组织机构同步至LDAP中相关的知识,希望对你有一定的参考价值。
代码参考: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("[email protected]"); 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中的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?