LDAP

1.介绍

1.1 简介

可以通过以下三句话快速的认识一下LDAP:
LDAP:Lightweight Directory Access Protocol,轻量目录访问协议。
LDAP服务是一个为只读(查询、浏览、搜索)访问而优化的非关系型数据库,呈树状结构组织数据。
LDAP主要用做用户信息查询(如邮箱、电话等)或对各种服务访问做后台认证以及用户数据权限管控。
通常,在实际工作环境中,都会通过LDAP来构建一个统一的账号管理、身份验证平台,实现SSO单点登录机制。
名词解释
DC:domain component一般为公司名,例如:dc=163,dc=com
OU:organization unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文
CN:common name为用户名或者服务器名,最长可以到80个字符,可以为中文
DN:distinguished name为一条LDAP记录项的名字,有唯一性,例如:dc:“cn=admin,ou=developer,dc=163,dc=com”
在这里插入图片描述
参考
搞懂OpenLDAP
ldap的详细介绍,搭建,配置管理,备份,案例

1.2 配置

slapd.conf
# 1.schema文件引入
ucdata-path	./ucdata
include		./schema/core.schema
include		./schema/cosine.schema
include		./schema/nis.schema
include		./schema/inetorgperson.schema
include		./schema/openldap.schema
include		./schema/dyngroup.schema


pidfile		./run/slapd.pid
argsfile	./run/slapd.args

# 2.SSL连接配置(证书)
TLSVerifyClient never
TLSCipherSuite HIGH:MEDIUM:-SSLv2
TLSCertificateFile ./secure/certs/server.pem
TLSCertificateKeyFile ./secure/certs/server.pem
TLSCACertificateFile ./secure/certs/server.pem

# 3.指定数据库
database	bdb 
# 4.配置根目录和超级用户
suffix		"dc=abcd,dc=com"
rootdn		"cn=Manager,dc=abcd,dc=com"
rootpw    {SSHA}moihaDAL4+sNm2+wYyL2wxYq00MMQh+n
# 5.数据存放目录(这里存放到当前文件的data目录中)
directory ./data
# 6.配置相关索引
dirtyread
searchstack 20
# Indices to maintain
index mail pres,eq
index objectclass pres
index default eq,sub
index sn eq,sub,subinitial
index telephonenumber
index cn
# 7.下面可以增加同步数据配置..

openldap slapd.conf参数
slapd.conf 配置文件

LDAP Schema

LDAP Schema说明
LDAP的Schema

ldif文件

通过定义LDIF 文件添加用户和用户组信息,然后通过ldapdd 进行添加
ldif的数据结构及一个DEMO
关于ldif文件的创建格式和规范

SSL证书pem

1.证书必须放到服务器,ldap服务器然后再在配置文件里关联,才能进行SSL连接
在这里插入图片描述

1.3 数据同步

1.3.1 模式

客户端主动
在这里插入图片描述
服务器端主动
在这里插入图片描述

2.下载安装

2.1 windows

2.1.1 下载地址

地址

2.1.2 安装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入services.msc ,打开服务器,找到服务器,看看是否正常启动
在这里插入图片描述

2.1.3 加载数据

data.ldif

dn: dc=abcd,dc=com
objectClass: domain

dn: ou=members,dc=abcd,dc=com
ou: members
objectClass: organizationalUnit

dn: cn=user1,ou=members,dc=abcd,dc=com
cn: user1
sn: USER1
uid: user1
userPassword: user1
objectClass: inetOrgPerson

dn: cn=user2,ou=members,dc=abcd,dc=com
cn: user2
sn: USER2
uid: user2
userPassword: user2
objectClass: inetOrgPerson

dn: cn=user3,ou=members,dc=abcd,dc=com
cn: user3
sn: USER3
uid: user3
userPassword: user3
objectClass: inetOrgPerson

1.把data.ldif文件放到ldap安装目录下,如图
在这里插入图片描述
2.修改ldap配置文件slapd.conf
在这里插入图片描述
3.关闭ldap服务,因为使用服务器端的命令(exe),都要先关闭掉服务才能执行
4.关闭掉服务器后,进入服务器目录,执行相关脚本,如图:
slapadd -v -l data.ldif在这里插入图片描述

2.1.4 工具查看

1.启动ldap服务
2.使用工具连接,如图:
在这里插入图片描述
在这里插入图片描述
或者
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 linux

3 windows使用

3.1

4 linux

5 java连接

5.1 查询

    public LdapContext connetLDAP() throws NamingException {
        // 连接Ldap需要的信息
        String ldapFactory = "com.sun.jndi.ldap.LdapCtxFactory";
        String ldapUrl = "ldap://192.168.0.101:389";// url
        String ldapAccount = "cn=Manager,dc=abcd,dc=com"; // 用户名
        String ldapPwd = "secret";//密码
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory);
        // LDAP server
        env.put(Context.PROVIDER_URL, ldapUrl);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, ldapAccount);
        env.put(Context.SECURITY_CREDENTIALS, ldapPwd);
        env.put("java.naming.referral", "follow");
        LdapContext ctxTDS = new InitialLdapContext(env, null);
        if (ctxTDS != null) {
            System.out.println("连接成功!!!");
        }
        return ctxTDS;
    }


    //查询
    @Test
    public void testSearch() throws Exception {
        LdapContext ctx = connetLDAP();
        // 设置过滤条件
        String uid = "user1";
        String filter = "(&(objectClass=*)(objectClass=inetOrgPerson)(uid=" + uid + "))";
        // 限制要查询的字段内容
        String[] attrPersonArray = { "dn", "cn", "uid", "cn", "userPassword", "objectClass" };
        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        // 设置将被返回的Attribute
        searchControls.setReturningAttributes(attrPersonArray);
        // 三个参数分别为:
        // 上下文;
        // 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
        // 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件
        NamingEnumeration<SearchResult> answer = ctx.search("cn=user1,ou=members,dc=abcd,dc=com", filter.toString(), searchControls);
        // 输出查到的数据
        while (answer.hasMore()) {
            SearchResult result = answer.next();
            NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
            while (attrs.hasMore()) {
                Attribute attr = attrs.next();
                System.out.println(attr.getID() + "=" + attr.get());
            }
            System.out.println("============");
        }
    }

在这里插入图片描述
在这里插入图片描述

5.2 添加

    @Test
    public void testAdd() throws Exception {
        LdapContext ctx = connetLDAP();
        Attributes attrs = new BasicAttributes(true);
        Attribute objclass = new BasicAttribute("objectClass");
        // 添加ObjectClass
        String[] attrObjectClassPerson = { "inetOrgPerson"};
        Arrays.sort(attrObjectClassPerson);
        for (String ocp : attrObjectClassPerson) {
            objclass.add(ocp);
        }
        attrs.put(objclass);
        String uid = "katezy";
        String userDN = "cn="+uid+",ou=members,dc=abcd,dc=com";
        // 密码处理
        attrs.put("uid", uid);
        attrs.put("cn", uid);
        attrs.put("sn", uid);
        attrs.put("userPassword", uid.getBytes("UTF-8"));
        ctx.createSubcontext(userDN, attrs);
    }

在这里插入图片描述

5.3 删除

    @Test
    public void testRemove() throws Exception {
        LdapContext ctx = connetLDAP();
        String uid = "katezy";
        String userDN = "cn="+uid+",ou=members,dc=abcd,dc=com";
        ctx.destroySubcontext(userDN);
        System.out.println("删除成功");
    }

在这里插入图片描述

参考:

Java命名目录接口(JNDI)教程–LDAP用户的高级主题
ldap的filter语法
JAVA_基本LDAP操作实例
Java LDAP操作
Spring LDAP的使用

spring-ldap官方文档学习
LDAP查询运算符
基本 LDAP 语法
使用Spring的LdapTemplate进行LDAP操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值