首页 > 其他分享 >spring-boot对接ldap实现crud

spring-boot对接ldap实现crud

时间:2023-04-14 15:24:37浏览次数:41  
标签:PowerUser cn spring powerUser crud boot ldap public String

之前查询了很多通过java对接ldap的,很多都说的不太容易理解,现在写一篇文章记录一下对接ldap的过程。

1.创建spring-boot项目,pom文件添加依赖

<!--    LDAP依赖    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-ldap</artifactId>
        </dependency>

2.添加连接配置信息

在application.properties配置文件中添加以下内容:

spring.ldap.urls=ldap://*.*.*.*:389
spring.ldap.username=cn=admin,dc=example,dc=com
spring.ldap.password=password
spring.ldap.base=dc=example,dc=com

 

3.创建model层对象(新添加的对象)

package com.nichols.fabric_ca_ldap.model;

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;

/**
 * @author nichols
 * @date 2023/4/12 17:14
 */
@Entry(objectClasses = {"inetOrgPerson"})
public class PowerUser {

    @Id
    private Name dn;

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

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

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

    @Attribute(name = "description")
    private String publicKey;

    @Override
    public String toString() {
        return "PowerUser{" +
                "dn=" + dn +
                ", cn='" + cn + '\'' +
                ", sn='" + sn + '\'' +
                ", userId='" + userId + '\'' +
                ", publicKey='" + publicKey + '\'' +
                '}';
    }

    public PowerUser(Name dn, String cn, String sn, String userId, String publicKey) {
        this.dn = dn;
        this.cn = cn;
        this.sn = sn;
        this.userId = userId;
        this.publicKey = publicKey;
    }

    public Name getDn() {
        return dn;
    }

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

    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
    }

    public PowerUser(String cn, String userId, String publicKey) {
        this.cn = cn;
        this.userId = userId;
        this.publicKey = publicKey;
    }

    public PowerUser() {
    }

    public String getCn() {
        return cn;
    }

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPublicKey() {
        return publicKey;
    }

    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }
}

其中对于我这个objectClasses类而言,dn、cn和sn是必须的,且在对象中定义的属性需要是inetOrgPerson类型具有的属性,且@Entry属性是必须的,objectClasses至少指定一个,由于第二部添加了配置信息这里不添加base信息。如何判断定义的类具有哪些属性,可以通过phpLDAPadmin的web端查看,也可通过ldap管理工具查看,以下为一个示例:

 

 

 如果想添加自定义属性可以去搜一下如何创建自定义对象。

4.创建service层,创建service类

package com.nichols.fabric_ca_ldap.service;


import com.nichols.fabric_ca_ldap.model.PowerUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.stereotype.Service;

import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;

import static org.springframework.ldap.query.LdapQueryBuilder.query;

/**
 * @author nichols
 * @date 2023/4/11 16:52
 */
@Service
public class LDAPService {

    @Autowired
    private LdapTemplate ldapTemplate;

   // 添加对象方法
    public String addInfoToLDAP(PowerUser powerUser) {
        ldapTemplate.create(powerUser);
        return "ok";
    }

    public PowerUser findByCn(String cn) {
        return ldapTemplate.findOne(query().where("cn").is(cn),PowerUser.class);
    }

    public PowerUser update(PowerUser powerUser) {
        ldapTemplate.update(powerUser);
        return powerUser;
    }

    public PowerUser delete(PowerUser powerUser) {
        ldapTemplate.delete(powerUser);
        return powerUser;
    }

    private Attributes getAttributes(PowerUser powerUser) {
        BasicAttributes attributes = new BasicAttributes();
        attributes.put("objectClass", "top");
        attributes.put("objectClass", "powerUser");
        attributes.put("cn", powerUser.getCn());
        attributes.put("userId", powerUser.getUserId());
        attributes.put("publicKey", powerUser.getPublicKey());
        return attributes;
    }

}

5.编写测试方法

   @Test
    void testAddLDAP() {
        PowerUser powerUser = new PowerUser(); // 新建对象
        powerUser.setDn(LdapNameBuilder.newInstance("cn=powerUser2,ou=org1").build()); // 应该为全路径,由于配置文件编写了base路径,因此写到base的下一级停止
        powerUser.setCn("powerUser2"); // cn与上面cn一致
        powerUser.setUserId("powerUser2"); // 设置属性值
        powerUser.setSn("PowerUserSn"); // 这是sn值
        powerUser.setPublicKey("test"); // 设置属性值
        String s = ldapService.addInfoToLDAP(powerUser); // 新增用户
        System.out.println(s);
        System.out.println("success");
    }

    @Test
    void testQueryLDAP() {
        PowerUser powerUser1 = ldapService.findByCn("powerUser1"); // 根据cn查找用户
        System.out.println(powerUser1);
        PowerUser powerUser2 = ldapService.findByCn("powerUser2");
        System.out.println("------------");
        System.out.println(powerUser2);
    }

    @Test
    void testUpdateLDAP() {
        PowerUser powerUser = new PowerUser();
        powerUser.setDn(LdapNameBuilder.newInstance("cn=powerUser2,ou=org1").build()); // 更新用户,保证cn、dn一致,修改属性值
        powerUser.setCn("powerUser2");
        powerUser.setUserId("powerUser3");
        powerUser.setSn("PowerUserSn");
        powerUser.setPublicKey("testUpdate");
        PowerUser powerUser1 = ldapService.update(powerUser);
        System.out.println(powerUser1);
    }

    @Test
    void testDeleteLDAP() {
        PowerUser powerUser = new PowerUser();
        powerUser.setDn(LdapNameBuilder.newInstance("cn=powerUser2,ou=org1").build()); // 根据dn删除用户对象
        PowerUser delete = ldapService.delete(powerUser);
        System.out.println(delete);
    }

 对接完成。

标签:PowerUser,cn,spring,powerUser,crud,boot,ldap,public,String
From: https://www.cnblogs.com/nichols1205/p/17318387.html

相关文章

  • SpringMVC上传大型视频文件到服务器,解决方案
    ​PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此指......
  • 1-Spring Cloud Alibaba 主要特性
    SpringCloudAlibaba是阿里巴巴开源中间件跟SpringCloud体系的融合:主要特性:1、流量控制和服务降级:使用阿里巴巴Sentinel进行流量控制,断路和系统自适应保护; 2、服务注册和发现:实例可以在AlibabaNacos上注册,客户可以使用Spring管理的bean发现实例,通过SpringCloudNetfl......
  • 2-Spring Cloud alibaba版本对应
    目前最新版本:SpringCloudAlibaba2.2.1 SpringCloudAlibaba2.1.0RELEASE对应SpringCloudGreenwich版本SpringCloudAlibaba2.2.0RELEASE对应SpringCloudHoxton.RELEASE版本SpringCloudAlibaba2.2.1RELEASE对应SpringCloudHoxton.SR3版本......
  • springboot-web-mybatis
    Restful开发规范Restful是网络应用接口程序的接口设计风格,基于HTTP协议GET:查询POST:新增PUT:修改DELETE:删除Restful是一种风格,可以不遵守如何为请求参数设置默认值可以在Service层判断是否为null,如果为true则给它赋值默认值可以在Controller层参数列表添加@RequstPa......
  • 29-springcloud-config-5-配置信息的加解密安全处理
    前面是在Git仓库中明文存储配置信息值,很多场景下,对于某些敏感的配置内容(例如数据库账号、密码等),应该加密存储,configserver为我们考虑到了这一点,对配置内容提供了加密与解密支持;安装JCEconfigserver的加解密功能依赖JavaCryptographyExtension(JCE)Java8JCE下载地址:http://......
  • spring-cloud-alibaba项目打包
    在父依赖中加入<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version......
  • Java SpringBoot 中,动态执行 bean 对象中的方法
    根据不同的条件,调用不同的bean对象,执行对象中的方法SpringUtils工具类packagecom.vipsoft.web.utils;importcn.hutool.core.util.ArrayUtil;importorg.springframework.aop.framework.AopContext;importorg.springframework.beans.BeansException;importorg.sprin......
  • SpringCloud Netflix 组件 的核心/原理
     1.Eureka:服务注册、续约、注销、心跳机制,集群的数据采用弱一致方案AP,分区的概念, https://blog.csdn.net/qq_22270363/article/details/1276690232.Ribbon:客户端(请求发起端)的负载均衡组件,核心有 --服务列表、负载均衡策略IRule、服务可用性检查IPing,负载均衡策略......
  • 使用Spring的getBeansOfType实现接口多实现类的动态调用
     背景org.springframework.beans及org.springframework.context这两个包是SpringIoC容器的基础,其中重要的类有BeanFactory,BeanFactory是IoC容器的核心接口,其职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖关系。ApplicationContext作为BeanFactory的子类......
  • 27-springcloud-config-3-构建 Spring cloud config 配置中心服务端
    构建一个springcloudconfig配置中心按照如下方式进行:1、创建一个普通的SpringBoot项目2、在pom.xml文件中添加如下依赖:<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-config-server</artifactId></dependency>......