SpringBoot 集成 LDAP

LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式

LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等

openLDAP部署

本文主要采用openLDAP部署,正常参考以下两篇文章即可部署完成

[LDAP部署卸载问题解决]([Openldap从安装到卸载 | textworld | Hugo Blog](https://www.textworld.cn/post/20201-08-03-openlad从安装到卸载/#:~:text=接着教大家怎么卸载openldap %24 systemctl stop slapd %24 systemctl disable,userdel ldap %23 删除openldap目录 %24 rm -rf %2Fetc%2Fopenldap))

[LDAP部署](2020年,手把手教你如何在CentOS7上一步一步搭建LDAP服务器的最新教程 - 知乎 (zhihu.com))

openLDAP 可视化

采用 docker 部署 phpldapadmin,改下端口号映射和IP即可

docker run -d --privileged -p 9090:80 --name myphpldapadmin \
  --env PHPLDAPADMIN_HTTPS=false --env PHPLDAPADMIN_LDAP_HOSTS=192.168.10.7  \
  --detach osixia/phpldapadmin

访问

http://192.168.10.7:9090

以上完成后会看到如下页面

重点:
此处账号其实为部署时的 cn=Manager,dc=ricman,dc=localhost
密码就是你设置的密码

创建LDAP账号



看这个创建好的账号,下文的 person 类的 @Entry(objectClasses = {"inetOrgPerson"}) 查询的就是 objectClasses 为 inetOrgPerson 的账号,也可添加其他两个条件

看属性后面凡是带有 alias 的 ,点点看前面的属性名称有惊喜哦🤨

以 User Name 举例,它在ldap中的字段名称其实是 uid 对应下文person类的 @Attribute(name = "uid")

SpringBoot 集成 LDAP

 <!-- LDAP集成 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-ldap</artifactId>
        </dependency>
spring:
  ldap:
    # ldap 服务
    urls: 'ldap://192.168.10.7:389'
    # ldap 管理员账号
    username: 'cn=Manager,dc=ricman,dc=localhost'
    password: 123456
    # ldap 根目录
    base: 'dc=ricman,dc=localhost'

一定要注意这个 Person类


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

/**
 * 注解属性对应 ldap 协议中的属性名称
 * objectClasses 查询 ldap协议中 objectClasses 为 inetOrgPerson 的账号
 */
@Entry(objectClasses = {"inetOrgPerson"})
@Data
public class Person {

    @Id
    @JsonIgnore // 必写
    private Name distinguishedName;

    @Attribute(name = "cn")
    private String cn;

    @Attribute(name = "mail")
    private String mail;

    @Attribute(name = "gidNumber")
    private Integer gidNumber;

    @Attribute(name = "homeDirectory")
    private String homeDirectory;

    @Attribute(name = "sn")
    private String sn;

    @Attribute(name = "uidNumber")
    private Integer uidNumber;

    @Attribute(name = "sAMAccountName")
    private String loginName;

    @Attribute(name = "uid")
    private String uid;

    @Attribute(name="givenName")
    private String givenName;

}

查询

package com.service.single.example.ldap;


import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.filter.EqualsFilter;
import org.springframework.ldap.query.LdapQueryBuilder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 集成 ldap协议 实现用户认证
 */
@Slf4j
@Service
public class LdapService {

    @Autowired
    private LdapTemplate ldapTemplate;

    public void test() {
        // 根据uid 和密码 查询用户是否存在
        EqualsFilter filter = new EqualsFilter("uid", "test1");
        boolean bool = ldapTemplate.authenticate("", filter.toString(), "123456");
        if (bool) {
            // 构建查询条件
            LdapQueryBuilder builder = LdapQueryBuilder.query();
            // 根据 uid查询
            builder.where("uid").is("test1");
            // 注意person 类,一定要跟 ldap协议中的属性名称对应
            Person person = ldapTemplate.findOne(builder, Person.class);
            System.out.println(JSON.toJSONString(person));
        } else {
            System.out.println("校验失败");
        }
    }


    public void test1() {
        // 查询 所有用户,注意 person类查询条件
        List<Person> ps = ldapTemplate.findAll(Person.class);
        if (ps.size() > 0) {
            System.out.println(JSON.toJSONString(ps));
        }
    }
}
posted @ 2022-09-15 18:02  暮雨寒冬  阅读(1961)  评论(0编辑  收藏  举报