Spring LDAP

這篇文章的目的

當(dāng)然是用“最”治力、“最”府适、”最“簡(jiǎn)單的方式來操作LDAP了勿侯。正好IBOMC項(xiàng)目的底層也是使用Spring LDAP的大家可以看看烈炭。

為啥要學(xué)習(xí)LDAP

鑒于中國移動(dòng)使用LDAP存儲(chǔ)數(shù)據(jù)已經(jīng)有很長(zhǎng)時(shí)間了導(dǎo)致過渡到Oracle很困難榜掌,公司內(nèi)的很多項(xiàng)目依然依賴LDAP优妙,因此JAVA對(duì)LDAP的操作還是需要學(xué)習(xí)下的。

Srping LDAP 是什么

Spring LDAP是Spring提供的一個(gè)簡(jiǎn)化JAVA對(duì)LDAP數(shù)據(jù)進(jìn)行操作的工具類似于Spring的JdbcTemplate憎账。

配置

1. 引入jar包

官網(wǎng) :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. 配置數(shù)據(jù)源

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. 配置數(shù)據(jù)源

這里有個(gè)要注意的就是base的值套硼,后續(xù)的DN(類似于文件夾中的路徑)都是基于這個(gè)的。

<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. 創(chuàng)建PO配置映射關(guān)系

在這個(gè)實(shí)體中
objectClasses(LDAP中每一個(gè)節(jié)點(diǎn)的規(guī)則胞皱,例如必填字段有哪些邪意,選填字段有哪些,規(guī)則是可以繼承的)
base 這里的base加上前面數(shù)據(jù)源配置中的base合起來就是完整的路徑
@Id 這個(gè)是必須有的生成每個(gè)條目都有一個(gè)路徑也可以說是地址
@Attribute下面的代碼表示把createDate變量和LDAP中的createDate字段關(guān)聯(lián)起來
@Attribute(name="createDate")
private String createDate;
@Transient表示忽略該變量
@DnAttribute用于表示該變量是DN的一個(gè)參數(shù)
@DnAttribute(value="cn",index = 0)
private String cn;
這里index=3表示是DN的第四個(gè)參數(shù)倒過來的
例如:以下是一個(gè)條目的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的調(diào)用方式和spring中其他的bean是一樣的
這里就不寫了方式很有多種反砌。

  1. 先來個(gè)最簡(jiǎn)單的查詢
    查找所有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());
}

結(jié)果:


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("測(cè)試資源組key");
        vo.setAdminAccount("huangyan");
        vo.setAdminPwd("111111");
        ldapTemplate.create(vo);
  1. 刪除
    這里cn是DN的最后一個(gè)參數(shù)
ldapTemplate.unbind("cn=4028b8815ebbcc77015ebbcc77010000");
//或者
ldapTemplate.unbind(windowsDto.getDn());
  1. 修改
ldapTemplate.update(windowsDto);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雾鬼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宴树,更是在濱河造成了極大的恐慌策菜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酒贬,死亡現(xiàn)場(chǎng)離奇詭異又憨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)同衣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門竟块,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耐齐,你說我怎么就攤上這事浪秘。” “怎么了埠况?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵耸携,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辕翰,道長(zhǎng)夺衍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任喜命,我火速辦了婚禮沟沙,結(jié)果婚禮上河劝,老公的妹妹穿的比我還像新娘。我一直安慰自己矛紫,他們只是感情好赎瞎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颊咬,像睡著了一般务甥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喳篇,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天敞临,我揣著相機(jī)與錄音,去河邊找鬼麸澜。 笑死挺尿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炊邦。 我是一名探鬼主播票髓,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铣耘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起以故,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蜗细,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后怒详,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炉媒,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年昆烁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吊骤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡静尼,死狀恐怖白粉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鼠渺,我是刑警寧澤鸭巴,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拦盹,受9級(jí)特大地震影響鹃祖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜普舆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一恬口、第九天 我趴在偏房一處隱蔽的房頂上張望校读。 院中可真熱鬧,春花似錦祖能、人聲如沸歉秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽端考。三九已至,卻和暖如春揭厚,著一層夾襖步出監(jiān)牢的瞬間却特,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工筛圆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裂明,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓太援,卻偏偏與公主長(zhǎng)得像闽晦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子提岔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理仙蛉,服務(wù)發(fā)現(xiàn),斷路器碱蒙,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 重要說明:本方是翻譯自https://docs.spring.io/spring-cloud-dataflow/d...
    靜悟2020閱讀 10,499評(píng)論 1 12
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,804評(píng)論 6 342
  • 背景 項(xiàng)目為Java Web工程荠瘪,標(biāo)準(zhǔn)的后臺(tái)管理界面程序。業(yè)務(wù)上需要增加對(duì)Active Directory中組織和...
    wolfwolfgod閱讀 2,098評(píng)論 1 1
  • 目錄服務(wù)就是按照樹狀存儲(chǔ)信息的模式赛惩。目錄服務(wù)的數(shù)據(jù)類型主要是字符型, 而不是關(guān)系數(shù)據(jù)庫提供的整數(shù)哀墓、浮點(diǎn)數(shù)、日期喷兼、貨...
    黑色I(xiàn)幽默閱讀 4,313評(píng)論 0 4