Spring LDAP

这篇文章的目的

当然是用“最”、“最”、”最“简单的方式来操作LDAP了。正好IBOMC项目的底层也是使用Spring LDAP的大家可以看看。

为啥要学习LDAP

鉴于中国移动使用LDAP存储数据已经有很长时间了导致过渡到Oracle很困难,公司内的很多项目依然依赖LDAP,因此JAVA对LDAP的操作还是需要学习下的。

Srping LDAP 是什么

Spring LDAP是Spring提供的一个简化JAVA对LDAP数据进行操作的工具类似于Spring的JdbcTemplate。

配置

1. 引入jar包

官网 :http://projects.spring.io/spring-ldap/
jar包的Maven地址:

<dependencies>
    <dependency>
        <groupId>org.springframework.ldap</groupId>
        <artifactId>spring-ldap-core</artifactId>
        <version>2.3.2.BUILD-SNAPSHOT</version>
    </dependency>
</dependencies><repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/libs-snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

2. 配置数据源

1. 在命名空间中增加以下描述

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

2. 配置数据源

这里有个要注意的就是base的值,后续的DN(类似于文件夹中的路径)都是基于这个的。

<ldap:context-source
    username="cn=Administrator"
    password="secret"
    url="ldap://localhost:389" 
    base="dc=boco,dc=cmcc,dc=com"
/>

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

3. 创建PO配置映射关系

在这个实体中
objectClasses(LDAP中每一个节点的规则,例如必填字段有哪些,选填字段有哪些,规则是可以继承的)
base 这里的base加上前面数据源配置中的base合起来就是完整的路径
@Id 这个是必须有的生成每个条目都有一个路径也可以说是地址
@Attribute下面的代码表示把createDate变量和LDAP中的createDate字段关联起来
@Attribute(name="createDate")
private String createDate;
@Transient表示忽略该变量
@DnAttribute用于表示该变量是DN的一个参数
@DnAttribute(value="cn",index = 0)
private String cn;
这里index=3表示是DN的第四个参数倒过来的
例如:以下是一个条目的DN
cn=4028b8815eb6f10f015eb6f110f30001,ou=windows,ou=device,ou=resource

package com.boco.model.dto;

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 javax.naming.Name;

/**
 * @author 黄炎
 * @Time 2017/9/18.14:12
 */
@Entry(objectClasses = {"Top", "iam-windows" ,"cmcc-windows","cmcc-device"}, base="ou=windows,ou=device,ou=resource")
public class WindowsDto extends  BaseDto {

    @Id
    private Name dn;

    public Name getDn() {
        return dn;
    }

    public void setDn(Name dn) {
        this.dn = dn;
    }

    //必填
    @Attribute(name="cn")
    @DnAttribute(value="cn",index = 3)
    private String cn;
    @Attribute(name="conType")
    private String conType;
    @Attribute(name="createDate")
    private String createDate;
    @Attribute(name="createUserKey")
    private String createUserKey;
    @Attribute(name="displayName")
    private String displayName;
    @Attribute(name="driverType")
    private String driverType;
    @Attribute(name="ip")
    private String ip;
    @Attribute(name="name")
    private String name;
    @Attribute(name="progDicKey")
    private String progDicKey;
    @Attribute(name="resourceGroupKey")
    private String resourceGroupKey;
    //选填
    @Attribute(name="adminAccount")
    private String adminAccount;
    @Attribute(name="adminPort")
    private String adminPort;
    @Attribute(name="adminPwd")
    private String adminPwd;
    @Attribute(name="desc")
    private String desc;
    @Attribute(name="manufacturer")
    private String manufacturer;
    @Attribute(name="modifyDate")
    private String modifyDate;
    @Attribute(name="modifyUserKey")
    private String modifyUserKey;
    //iam-windows                       ;
    @Attribute(name="accessPolicykey")
    private String accessPolicykey;
    @Attribute(name="accountIsoType")
    private String accountIsoType;
    @Attribute(name="adminPrompt")
    private String adminPrompt;
    @Attribute(name="areaDicKey")
    private String areaDicKey;
    @Attribute(name="bakIp")
    private String bakIp;
    @Attribute(name="conPrompt")
    private String conPrompt;
    @Attribute(name="connected")
    private String connected;

    public String getCn() {
        return cn;
    }

    public void setCn(String cn) {
        this.cn = cn;
    }

    public String getConType() {
        return conType;
    }

    public void setConType(String conType) {
        this.conType = conType;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getCreateUserKey() {
        return createUserKey;
    }

    public void setCreateUserKey(String createUserKey) {
        this.createUserKey = createUserKey;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getDriverType() {
        return driverType;
    }

    public void setDriverType(String driverType) {
        this.driverType = driverType;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getProgDicKey() {
        return progDicKey;
    }

    public void setProgDicKey(String progDicKey) {
        this.progDicKey = progDicKey;
    }

    public String getResourceGroupKey() {
        return resourceGroupKey;
    }

    public void setResourceGroupKey(String resourceGroupKey) {
        this.resourceGroupKey = resourceGroupKey;
    }

    public String getAdminAccount() {
        return adminAccount;
    }

    public void setAdminAccount(String adminAccount) {
        this.adminAccount = adminAccount;
    }

    public String getAdminPort() {
        return adminPort;
    }

    public void setAdminPort(String adminPort) {
        this.adminPort = adminPort;
    }

    public String getAdminPwd() {
        return adminPwd;
    }

    public void setAdminPwd(String adminPwd) {
        this.adminPwd = adminPwd;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(String modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getModifyUserKey() {
        return modifyUserKey;
    }

    public void setModifyUserKey(String modifyUserKey) {
        this.modifyUserKey = modifyUserKey;
    }

    public String getAccessPolicykey() {
        return accessPolicykey;
    }

    public void setAccessPolicykey(String accessPolicykey) {
        this.accessPolicykey = accessPolicykey;
    }

    public String getAccountIsoType() {
        return accountIsoType;
    }

    public void setAccountIsoType(String accountIsoType) {
        this.accountIsoType = accountIsoType;
    }

    public String getAdminPrompt() {
        return adminPrompt;
    }

    public void setAdminPrompt(String adminPrompt) {
        this.adminPrompt = adminPrompt;
    }

    public String getAreaDicKey() {
        return areaDicKey;
    }

    public void setAreaDicKey(String areaDicKey) {
        this.areaDicKey = areaDicKey;
    }

    public String getBakIp() {
        return bakIp;
    }

    public void setBakIp(String bakIp) {
        this.bakIp = bakIp;
    }

    public String getConPrompt() {
        return conPrompt;
    }

    public void setConPrompt(String conPrompt) {
        this.conPrompt = conPrompt;
    }

    public String getConnected() {
        return connected;
    }

    public void setConnected(String connected) {
        this.connected = connected;
    }

    public String getIamAllowConnect() {
        return iamAllowConnect;
    }

    public void setIamAllowConnect(String iamAllowConnect) {
        this.iamAllowConnect = iamAllowConnect;
    }

    public String getIamDepDomain() {
        return iamDepDomain;
    }

    public void setIamDepDomain(String iamDepDomain) {
        this.iamDepDomain = iamDepDomain;
    }

    public String getIamDevicePwdPolicyKey() {
        return iamDevicePwdPolicyKey;
    }

    public void setIamDevicePwdPolicyKey(String iamDevicePwdPolicyKey) {
        this.iamDevicePwdPolicyKey = iamDevicePwdPolicyKey;
    }

    public String getIamDeviceStatus() {
        return iamDeviceStatus;
    }

    public void setIamDeviceStatus(String iamDeviceStatus) {
        this.iamDeviceStatus = iamDeviceStatus;
    }

    public String getIamResAccountPolicy() {
        return iamResAccountPolicy;
    }

    public void setIamResAccountPolicy(String iamResAccountPolicy) {
        this.iamResAccountPolicy = iamResAccountPolicy;
    }

    public String getIamResAdminUserKey() {
        return iamResAdminUserKey;
    }

    public void setIamResAdminUserKey(String iamResAdminUserKey) {
        this.iamResAdminUserKey = iamResAdminUserKey;
    }

    public String getIamResFlag() {
        return iamResFlag;
    }

    public void setIamResFlag(String iamResFlag) {
        this.iamResFlag = iamResFlag;
    }

    public String getIamResouceVersionDicKey() {
        return iamResouceVersionDicKey;
    }

    public void setIamResouceVersionDicKey(String iamResouceVersionDicKey) {
        this.iamResouceVersionDicKey = iamResouceVersionDicKey;
    }

    public String getIamSystemType() {
        return iamSystemType;
    }

    public void setIamSystemType(String iamSystemType) {
        this.iamSystemType = iamSystemType;
    }

    public String getIamWindowsJump() {
        return iamWindowsJump;
    }

    public void setIamWindowsJump(String iamWindowsJump) {
        this.iamWindowsJump = iamWindowsJump;
    }

    public String getIpType() {
        return ipType;
    }

    public void setIpType(String ipType) {
        this.ipType = ipType;
    }

    public String getIpv4() {
        return ipv4;
    }

    public void setIpv4(String ipv4) {
        this.ipv4 = ipv4;
    }

    public String getIpv6() {
        return ipv6;
    }

    public void setIpv6(String ipv6) {
        this.ipv6 = ipv6;
    }

    public String getIsOperative() {
        return isOperative;
    }

    public void setIsOperative(String isOperative) {
        this.isOperative = isOperative;
    }

    public String getIsSudoModel() {
        return isSudoModel;
    }

    public void setIsSudoModel(String isSudoModel) {
        this.isSudoModel = isSudoModel;
    }

    public String getIsVirRes() {
        return isVirRes;
    }

    public void setIsVirRes(String isVirRes) {
        this.isVirRes = isVirRes;
    }

    public String getLogip() {
        return logip;
    }

    public void setLogip(String logip) {
        this.logip = logip;
    }

    public String getPhysicalMacIp() {
        return physicalMacIp;
    }

    public void setPhysicalMacIp(String physicalMacIp) {
        this.physicalMacIp = physicalMacIp;
    }

    public String getResStatus() {
        return resStatus;
    }

    public void setResStatus(String resStatus) {
        this.resStatus = resStatus;
    }

    public String getVirResCon() {
        return virResCon;
    }

    public void setVirResCon(String virResCon) {
        this.virResCon = virResCon;
    }

    public String getVirResCreateTime() {
        return virResCreateTime;
    }

    public void setVirResCreateTime(String virResCreateTime) {
        this.virResCreateTime = virResCreateTime;
    }

    public String getVirResCreateUser() {
        return virResCreateUser;
    }

    public void setVirResCreateUser(String virResCreateUser) {
        this.virResCreateUser = virResCreateUser;
    }

    public String getVirResDesc() {
        return virResDesc;
    }

    public void setVirResDesc(String virResDesc) {
        this.virResDesc = virResDesc;
    }

    public String getVirResId() {
        return virResId;
    }

    public void setVirResId(String virResId) {
        this.virResId = virResId;
    }

    public String getVirResTemp() {
        return virResTemp;
    }

    public void setVirResTemp(String virResTemp) {
        this.virResTemp = virResTemp;
    }

    public String getVirResTempId() {
        return virResTempId;
    }

    public void setVirResTempId(String virResTempId) {
        this.virResTempId = virResTempId;
    }

    public String getDomainDN() {
        return domainDN;
    }

    public void setDomainDN(String domainDN) {
        this.domainDN = domainDN;
    }

    public String getDomainName() {
        return domainName;
    }

    public void setDomainName(String domainName) {
        this.domainName = domainName;
    }

    private String iamAllowConnect;
    private String iamDepDomain;
    private String iamDevicePwdPolicyKey;
    private String iamDeviceStatus;
    private String iamResAccountPolicy;
    private String iamResAdminUserKey;
    private String iamResFlag;
    private String iamResouceVersionDicKey;
    private String iamSystemType;
    private String iamWindowsJump;
    private String ipType;
    private String ipv4;
    private String ipv6;
    private String isOperative;
    private String isSudoModel;
    private String isVirRes;
    private String logip;
    private String physicalMacIp;
    private String resStatus;
    private String virResCon;
    private String virResCreateTime;
    private String virResCreateUser;
    private String virResDesc;
    private String virResId;
    private String virResTemp;
    private String virResTempId;
    //cmcc-windows                      ;
    private String domainDN;
    private String domainName;
}

4.使用

LdapTemplate的调用方式和spring中其他的bean是一样的
这里就不写了方式很有多种。

  1. 先来个最简单的查询
    查找所有objectclass字段是cmcc-windows的条目
List<WindowsDto> list =  ldapTemplate.find(query().where("objectclass").is("cmcc-windows"), WindowsDto.class);
for(WindowsDto windowsDto :list){
  System.out.println(windowsDto.getIp());
}

结果:


Paste_Image.png
  1. 新增
        WindowsDto vo = new WindowsDto();
        vo.setCn(this.getSequence());
        vo.setConType("conType");
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        vo.setCreateDate(format.format(new Date()));
        vo.setCreateUserKey("huangyan");
        vo.setDisplayName("hy");
        vo.setDriverType("windows");
        vo.setIp("192.168.1.990");
        vo.setName("testEntry");
        vo.setProgDicKey("what is it");
        vo.setResourceGroupKey("测试资源组key");
        vo.setAdminAccount("huangyan");
        vo.setAdminPwd("111111");
        ldapTemplate.create(vo);
  1. 删除
    这里cn是DN的最后一个参数
ldapTemplate.unbind("cn=4028b8815ebbcc77015ebbcc77010000");
//或者
ldapTemplate.unbind(windowsDto.getDn());
  1. 修改
ldapTemplate.update(windowsDto);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容