LDAP介绍

介绍

LDAP是域的一种管理系统。
LDAP的存储结构为树状结构,由父节点、子节点、叶子节点组成。

概念

Entry

条目,LDAP系统中最基本的颗粒,类似于数据库的记录。通常对LDAP的增删查改是以条目为基本对象。

dn

相当于条目的id,通常由包含ou、cn、dc等组成,例如:cn=test_test_1_6_210,ou=test3,ou=test2,ou=test_group,ou=Users。LDAP能通过dn清晰表示出该条目在LDAP系统中的位置。

Attribute

条目的属性

用户属性

userAccountControl

属性标志 十六进制值 十进制值 说明
SCRIPT 0x0001 1 将运行登录脚本
ACCOUNTDISABLE 0x0002 2 禁用用户帐户
HOMEDIR_REQUIRED 0x0008 8 需要主文件夹
LOCKOUT 0x0010 16 不需要密码
PASSWD_NOTREQD 0x0020 32 用户不能更改密码。可以读取此标志,但不能直接设置它
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128 用户可以发送加密的密码
TEMP_DUPLICATE_ACCOUNT 0x0100 256 此帐户属于其主帐户位于另一个域中的用户。此帐户为用户提供访问该域的权限,但不提供访问信任该域的任何域的权限。有时将这种帐户称为“本地用户帐户
NORMAL_ACCOUNT 0x0200 512 典型用户的默认帐户类型
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048 对于信任其他域的系统域,此属性允许信任该系统域的帐户
WORKSTATION_TRUST_ACCOUNT 0x1000 4096 运行 Microsoft Windows NT 4.0 Workstation、Microsoft Windows NT 4.0 Server、Microsoft Windows 2000 Professional 或 Windows 2000 Server 并且属于该域的计算机的计算机帐户
SERVER_TRUST_ACCOUNT 0x2000 8192 属于该域的域控制器的计算机帐户
DONT_EXPIRE_PASSWORD 0x10000 65536 在该帐户上永远不会过期的密码
MNS_LOGON_ACCOUNT 0x20000 131072 MNS 登录帐户
SMARTCARD_REQUIRED 0x40000 262144 设置此标志后,将强制用户使用智能卡登录
TRUSTED_FOR_DELEGATION 0x80000 524288 设置此标志后,将信任运行服务的服务帐户(用户或计算机帐户)进行 Kerberos 委派。任何此类服务都可模拟请求该服务的客户端。若要允许服务进行 Kerberos 委派,必须在服务帐户的userAccountControl 属性上设置此标志
NOT_DELEGATED 0x100000 1048576 设置此标志后,即使将服务帐户设置为信任其进行 Kerberos 委派,也不会将用户的安全上下文委派给该服务
USE_DES_KEY_ONLY 0x200000 2097152 (Windows 2000/Windows Server 2003) 将此用户限制为仅使用数据加密标准 (DES) 加密类型的密钥。
DONT_REQ_PREAUTH 0x400000 4194304 (Windows 2000/Windows Server 2003) 此帐户在登录时不需要进行 Kerberos 预先验证
PASSWORD_EXPIRED 0x800000 8388608 (Windows 2000/Windows Server 2003) 用户的密码已过期
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216 (Windows 2000/Windows Server 2003) 允许该帐户进行委派。这是一个与安全相关的设置。应严格控制启用此选项的帐户。此设置允许该帐户运行的服务冒充客户端的身份,并作为该用户接受网络上其他远程服务器的身份验证
ObjectClass

条目的属性的集合

Schema

ObjectClass的集合。确保从外部导入数据到LDAP时的数据结构与现有数据结构一致性。

backend

读写数据的操作的单元模块

database

存储数据

缩写

缩写 全称 内容
DC Domain Component 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com
UID User Id 用户ID songtao.xu(一条记录的ID)
OU Organization Unit 组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
CN Common Name 公共名称,如“Thomas Johansson”(一条记录的名称)
SN Surname 姓,如“许”
DN Distinguished Name “uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
RDN Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

springboot整合

依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-ldap</artifactId></dependency>

ladp版本跟随springboot版本即可

配置项

spring:ldap:urls: ldap://123:389base: dc=123-123,dc=cnusername: cn=123,dc=123,dc=cnpassword: asdfjackson:serialization:# 不关闭jackson序列化,输出Name类型的dn会报错FAIL_ON_EMPTY_BEANS: false

实体类

base只填写至ou部分即可
objectClass从这里找,此界面为php-ldap-admin

成员

package com.me.ldap.domain;import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import org.springframework.ldap.support.LdapNameBuilder;import javax.naming.Name;
import javax.naming.ldap.LdapName;
import java.io.Serializable;
import java.util.List;/*** @author Wuzhiming*/
@Entry(objectClasses = {"inetOrgPerson"}, base = "ou=Users")
public class Person implements Serializable {private static final long serialVersionUID = 2537331577057988415L;@Idprivate Name dn;/*** 用户唯一标识*/@Attribute(name = "cn")private String cn;@Attribute(name = "sn")private String sn;@Attribute(name = "userPassword")private String userPassword;@Attribute(name = "ou")private String groupName;@Attribute(name = "userAccountControl")private String userAccountControl;public String getGroupName() {return groupName;}public void setGroupName(String groupName) {this.groupName = groupName;}public String getUserAccountControl() {return userAccountControl;}public void setUserAccountControl(String userAccountControl) {this.userAccountControl = userAccountControl;}public Person(String cn) {LdapName dn = LdapNameBuilder.newInstance().add("o", "Users").add("cn", cn).add("dc", "yuang-group").build();this.dn = dn;}public Person(String cn, String groupName) {LdapName dn = LdapNameBuilder.newInstance().add("o", groupName).add("cn", cn).add("dn", "Users").add("dc", "yuang-group").build();this.dn = dn;}public Person() {}/*** getter*/public Name getDn() {return dn;}public String getCn() {return cn;}public String getSn() {return sn;}public String getUserPassword() {return userPassword;}/** setter */public void setDn(Name dn) {this.dn = dn;}public void setCn(String cn) {this.cn = cn;}public void setGroup(String groupName) {if (this.dn == null) {LdapName dn = LdapNameBuilder.newInstance().add("ou","Users").add("ou", groupName).add("cn",cn).build();this.dn = dn;}}public void setGroup(List<String> groupNameList) {if (this.dn == null) {LdapNameBuilder builder = LdapNameBuilder.newInstance().add("ou", "Users");for (String groupName : groupNameList) {builder=builder.add("ou",groupName);}LdapName dn = builder.add("cn", cn).build();this.dn = dn;}}public void setSn(String sn) {this.sn = sn;}public void setUserPassword(String userPassword) {this.userPassword = userPassword;}@Overridepublic String toString() {return "Person{" +"dn=" + dn +", cn='" + cn + '\'' +", sn='" + sn + '\'' +", userPassword='" + userPassword + '\'' +", groupName='" + groupName + '\'' +'}';}
}

成员组

package com.me.ldap.domain;import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import org.springframework.ldap.support.LdapNameBuilder;import javax.naming.Name;
import java.util.List;@Entry(objectClasses = {"organizationalUnit","top"},base = "ou=Users")
public class Group {@Idprivate Name dn;@Attribute(name = "ou")private String name;public Name getDn() {return dn;}public void setGroupName(List<String> groupNameList) {if(this.dn==null){LdapNameBuilder builder = LdapNameBuilder.newInstance();builder.add("ou","Users");for (String groupName : groupNameList) {builder=builder.add("ou",groupName);}dn=builder.build();}}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Group{" +"dn=" + dn +", name='" + name + '\'' +'}';}
}

前端传参接收类

用户

package com.me.ldap.domain.param;import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import org.springframework.ldap.support.LdapNameBuilder;import javax.naming.Name;
import java.io.Serializable;
import java.util.List;/*** @author Wuzhiming*/
@Data
public class AddPersonParam implements Serializable {private static final long serialVersionUID = -3761043026736955966L;private List<String> groupName;private String cn;private String sn;private String userPassword;}

用户组

package com.me.ldap.domain.param;import lombok.Data;import java.util.List;/*** @author Wuzhiming*/
@Data
public class AddGroupParam {private List<String> groupNameList;}

增删查改

查询

查询单个用户
    public Person getPersonByCn(String cn) {Person cn1 = ldapTemplate.findOne(query().where("cn").is(cn), Person.class);return cn1;}
查询所有用户(只包含在base下的)
    public List<Person> getAll() {return ldapTemplate.findAll(Person.class);}

新增

    /*** 创建用户** @param personParam*/public void create(AddPersonParam personParam) {Person person = new Person();BeanCopier beanCopier = BeanCopier.create(AddPersonParam.class, Person.class, false);beanCopier.copy(personParam, person, null);person.setGroup(personParam.getGroupName());System.out.println(person);ldapTemplate.create(person);}
{"groupName": ["test_group","test2","test3"],"cn": "test_test_1_6_20","sn": "114851418","userPassword": "123456abcABC."
}
注意事项
  1. 只能在${base}组和以下级别的节点上创建用户。
  2. 添加用户前必须先创建用户组,create()不能级联创建用户组。
  3. 非base组的级别,即在{base}组的级别,即在base组的级别,即在{base}级别以下的成员组中加入用户,则需要写上此成员组及所有成员组名(${base}除外)
  4. cn必须保证全局唯一

删除

删除本节点
    public void deletePerson(String personCn) {Person person = this.getPersonByCn(personCn);System.out.println(person);ldapTemplate.delete(person);}
注意事项
  1. 删除本节点时,本节点不能有任何子节点,否则会报错
级联删除
        Group group = new Group();BeanCopier beanCopier = BeanCopier.create(AddGroupParam.class, Group.class, false);beanCopier.copy(param, group, null);group.setGroupName(param.getGroupNameList());System.out.println(group);ldapTemplate.unbind(group.getDn(),true);

springboot整合ldap相关推荐

  1. SpringBoot --- 整合Ldap

    SpringBoot --- 整合Ldap 1.介绍 2.代码 2.1 pom.xml 2.2 配置文件 2.3 代码 整理不易,不喜勿喷.谢谢 SpringBoot - 整合Ldap. Spring ...

  2. springboot 整合 LDAP

    springboot 整合 LDAP 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId>& ...

  3. SpringBoot集成Ldap

    目录 什么是Ldap 为什么需要Ldap Ldap基本模型 Springboot集成Ldap Springboot操作Ldap 什么是Ldap 轻型目录访问协议(英文:Lightweight Dire ...

  4. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  5. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  6. springboot整合shiro使用shiro-spring-boot-web-starter

    此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...

  7. db2 springboot 整合_springboot的yml配置文件通过db2的方式整合mysql的教程

    springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件 先配置MySQL,代码如下 spring: datasour ...

  8. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  9. 八、springboot整合Spring Security

    springboot整合Spring Security 简介 Spring Security是一个功能强大且可高度自定义的身份验证和访问控制框架.它是保护基于Spring的应用程序的事实标准. Spr ...

最新文章

  1. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术
  2. BAP 使用DYNP_VALUES_READ来获取屏幕字段值
  3. jscript换行等特殊字符
  4. jetty9更改post请求长度
  5. 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?
  6. 成田机场access西瓜卡_糟了,是心动的感觉!无限次机场/高铁接送,高端商旅神卡权益再升级...
  7. Loj #2324. 「清华集训 2017」小 Y 和二叉树
  8. python进阶10并发之六并行化改造
  9. 项目owner看这里,MaxCompute全表扫描新功能,给你“失误”的机会
  10. 序列最小最优化算法(SMO) SVM凸优化求
  11. Python爬虫 获得淘宝商品评论
  12. 4.3 数值分析: 简单迭代法的构造和收敛条件
  13. 会PLC也能玩转机器视觉(一)
  14. bh1750c语言程序,BH1750FVI数字光线强度传感器 51单片机源程序
  15. 【VFI系列2】视频内插帧中基于optical flow的 backward/forward warping
  16. 软件 互操作性测试,软件兼容性测试与互操作性测试辩析
  17. 京东上传图片到JD API接口
  18. 为什么精英都是时间控
  19. 计算机为用户设置上网时间,电脑怎么设置上网时间限制
  20. nodemailer如何配置公司邮箱发送邮件

热门文章

  1. 自动化测试 - 如何自动提取手机短信验证码
  2. java.sql.SQLException: Access denied for user ‘root’@‘localhost’ (using password: YES)和错误原因 解决方案:
  3. 期权希腊值之delta【python复现】
  4. 运筹说 第5期 | 运筹学江湖的形成
  5. 《2018跟着小虎玩着去软考--小虎新视角历年信息系统项目管理师试题讲解(2014-2017)》软考书之序言
  6. 测试管理之--文档管理
  7. python 响铃_python——字符串-阿里云开发者社区
  8. 人工智能 | ShowMeAI资讯日报 #2022.06.08
  9. 美服行星边际2服务器维护时间,行星边际2美服证书 快速起步攻略新手必读
  10. jerryscript有关“error: inlining failed in call to always_inline”问题的解决