首页 > 其他分享 >2022-9-22-LDAP总结

2022-9-22-LDAP总结

时间:2024-03-22 17:38:02浏览次数:17  
标签:String 22 ldap springframework private 2022 org import LDAP

目录服务、目录书概念、LDAP、docker-compose方式安装、springboot中访问

目录服务

1)目录服务是一个特殊的数据库.用来保存描述性的、基于属性的详细信息,支持过滤功能。
2)是动态的,灵活的,易扩展的。
如:人员组织管理,电话箱,地址簿。

目录树概念

1)目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
2)条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
3)对象类:与某个实体类型对应的一组屈性,对象类是可以继承的,这样父类的必须属性也会被继承下来。
4.属性:描述条目的某个方面的信息。一个属性由一个属性类型和一个或多个属性值组成,属性有必须属性和非必须属性。

LDAP

LDAP (Light Directory Access Portocol),它是基于X.50O标准的轻录级目录访问协议.
目录是一个为查询、测览和搜索而优化的数据库,它成树状结构组织数据,类以文件目录一样。
目录数据库和关系数据库不同,它有优异的读性能.但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的就好象它的名字一样。
LDAP目录服务是由目录数据库和一套访问协议组成的系统。

关键词 英文简称 含义
uid User ld 用户ID songtao.xu(一条记录的lD)
ou Organization Unit 组织单位,组织单位可以包含其他各种对象(包括其他组织单元)
cn Common Name 公共名称,如Thomas Johansson(一条记录的名称)
sn Surname 姓,如“许”
dn Distinguished Name “uid=songtao.xu,ou=oa,dc=example,dc=com",一条记录的位置(唯一)相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,

docker-compose方式安装

version: "3"
services:
  # 1.安装openldap
  openldap:
    container_name: openldap
    image: osixia/openldap:1.4.0
    restart: always
    environment:
      LDAP_ORGANISATION: "test openldap"
      LDAP_DOMAIN: "koal.com"
      LDAP_ADMIN_PASSWORD: "12345678"
      LDAP_CONFIG_PASSWORD: "12345678"
    volumes:
      - /data/openldap/data:/var/lib/ldap
      - /data/openldap/config:/etc/ldap/slapd.d
    ports:
      - '389:389'
  # 2.安装phpldapadmin
  phpldapadmin:
    container_name: phpldapadmin
    image: osixia/phpldapadmin:latest
    restart: always
    environment:
      PHPLDAPADMIN_HTTPS: "false"
      PHPLDAPADMIN_LDAP_HOSTS: openldap
    ports:
      - '30004:80'
    depends_on:
      - openldap
      # cn=admin,dc=test,dc=com 密码:123456

springboot中访问

1)依赖

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

2)配置

这里从数据库中取,也可以从配置变量中取

import cn.hutool.json.JSONObject;
import com.koal.modules.sys.service.SysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;

import java.util.HashMap;
import java.util.Map;

/**
 * LDAP 的自动配置类
 *
 * 完成连接 及LdapTemplate生成
 */
@Configuration
public class LdapConfiguration {

    @Autowired
    SysConfigService sysConfigService;

    @Bean
    public LdapContextSource getContextSource() {
        LdapContextSource contextSource = new LdapContextSource();
        Map<String, Object> config = new HashMap();

        String ldapConfString = sysConfigService.getValue("SYS_NORMAL_CONFIG_KEY");
        JSONObject ldapConf = new JSONObject(ldapConfString);

        contextSource.setUrl((String) ldapConf.getByPath("ldap.urls"));
        contextSource.setBase((String) ldapConf.getByPath("ldap.base"));
        contextSource.setUserDn( (String) ldapConf.getByPath("ldap.username"));
        contextSource.setPassword((String) ldapConf.getByPath("ldap.password"));

        //  解决 乱码 的关键一句
        config.put("java.naming.ldap.attributes.binary", "objectGUID");

        contextSource.setPooled(true);
        contextSource.setBaseEnvironmentProperties(config);
        return contextSource;
    }


    @Bean
    public LdapTemplate getLdapTemplate() {
        return new LdapTemplate(getContextSource());
    }

}

3)自定义实体类


import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
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;
import java.util.List;

/**
 * @author sunjinchen
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entry(objectClasses = {"inetOrgPerson", "userSecurityInformation", "person"})
public class UserLdap {
    @Id
    @JsonIgnore
    private Name dn;
    /**
     * uid
     */
    private String uid;
    /**
     * 名
     */
    private String givenName;
    /**
     * 姓
     */
    private String sn;
    /**
     * 地区
     */
    private String street;
    /**
     * 部门
     */
    private String ou;
    /**
     * 组名(多个组,需要创建多个employeeType属性)
     */
    @Attribute(name="employeeType")
    private List<String> employeeType;

    @Attribute(name="objectClass")
    private List<String> objectClass;
    /**
     * 登录名
     */
    @Attribute(name="displayName")
    private String displayName;
    /**
     * 电子邮件
     */
    @Attribute(name="mail")
    private String mail;
    /**
     * 姓名
     */
    private String cn;
    /**
     * 状态 2000 - 正常 -1000 停用
     */
    private String st;
    /**
     * 岗位(编号)
     */
    private String businessCategory;
}

4)操作

package com.koal;

import com.koal.modules.ldap.entity.UserLdap;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.NameAwareAttribute;
import org.springframework.ldap.query.LdapQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;

import javax.naming.InvalidNameException;
import javax.naming.Name;
import javax.naming.directory.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.ldap.LdapName;
import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test {
    @Autowired
    LdapTemplate ldapTemplate;

    /**
     * 查询
     */
    @org.junit.Test
    public void test1(){
        List<UserLdap> list= ldapTemplate.find(LdapQueryBuilder.query().where("displayName").like("zhanghuan"), UserLdap.class);
        System.out.println(list);
    }

    /**
     * 修改
     * @throws InvalidNameException
     */
    @org.junit.Test
    public void test2() throws InvalidNameException {
        Name name = new LdapName("cn=redmine, ou=KMISTR");
        ModificationItem[] modificationItems = new ModificationItem[1];
        NameAwareAttribute nameAwareAttribute = new NameAwareAttribute("employeeType");
        nameAwareAttribute.add("test");
        nameAwareAttribute.add("test1");
        modificationItems[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
                nameAwareAttribute);

        ldapTemplate.modifyAttributes(name,modificationItems);
    }

    /**
     * 修改
     */
    @org.junit.Test
    public void test3(){
        List<UserLdap> list= ldapTemplate.find(LdapQueryBuilder.query().where("cn").is("redmine"),UserLdap.class);
        System.out.println(list);
        if(list.size()>0){
            UserLdap userLdap = list.get(0);
            List<String> employeeType = new ArrayList<>();
            employeeType.add("test000");
            userLdap.setEmployeeType(employeeType);
            ldapTemplate.update(userLdap);
        }
    }

    /**
     * 新增
     * @throws InvalidNameException
     */
    @org.junit.Test
    public void test4() throws InvalidNameException {
        UserLdap userLdap = new UserLdap();
        Name dn = new LdapName("cn=test,ou=KMISTR");
        userLdap.setSn("test");
        userLdap.setDn(dn);
        userLdap.setOu("KMISTR");
        ldapTemplate.create(userLdap);
    }

    /**
     * 删除
     * @throws InvalidNameException
     */
    @org.junit.Test
    public void test5() throws InvalidNameException {
        Name dn = new LdapName("cn=test,ou=KMISTR");
        UserLdap userLdap = ldapTemplate.findByDn(dn,UserLdap.class);
        ldapTemplate.delete(userLdap);
    }
}

标签:String,22,ldap,springframework,private,2022,org,import,LDAP
From: https://www.cnblogs.com/sylvesterzhang/p/18089899

相关文章

  • 2022-12-2-ruby入门
    第一个程序、定义类、打印方法、判断是否有方法属性、放开属性、数组、注释、字符串操作、字典、类型转换、静态方法、继承、模块、流程控制、循环、异常处理第一个程序defsayHelloputs'helloword'endsayHello定义类#类名第一个字母必须大写classPlayerde......
  • 2023-12-22-flink-cdc使用
    应用场景、上手体验应用场景FlinkCDC(ChangeDataCapture)是一种用于捕获和处理数据源中的变化的流处理技术。它可以实时地将数据源中的增量更新捕获到流处理作业中,使得作业可以实时响应数据变化。以下是FlinkCDC的一些常见应用场景:数据仓库和实时分析:FlinkCDC可以......
  • 2021-10-22-go语言基础
    概述、变量、常量、运算符和函数、导包、指针、defer、数组、切片、map、type使用、面向对象、反射、chanel、协程、json操作、随机数、网络编程、读取文件、beego概述1特性:自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发......
  • 2020-6-22-MySQL高级
    数据库引擎对比、索引、SQL语句的性能分析、优化、其他数据库引擎对比MyISAMInnoDB外键不支持支持事务不支持支持行表锁表锁行锁缓存只缓存索引索引、数据都缓存表空间小大关注点性能事务索引1索引分类单值索引:一个索引只包含单个......
  • 20240322每日一题题解
    20240322每日一题题解Problem输入\(n\)个不大于\(10^5\)的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。第一行输入一个正整数\(n\),表示整数个数。第二行输入\(n\)个正整数\(a_i\),以空格隔开。输出一行,依次输出\(a_i\)中剩余的质数,以空格......
  • mysql使用mysqldump.exe导出为sql脚本,进行导入时出现ERROR 1227 (42000) at line 18:
    mysql使用mysqldump.exe导出为sql脚本,进行导入时出现ERROR1227(42000)atline18:Accessdenied;youneed(atleastoneof)theSUPERorSYSTEM_VARIABLES_ADMINprivilege(s)forthisoperation。Warning:ApartialdumpfromaserverthathasGTIDswillbydefaul......
  • 「ABC221D」 Online games
    题意给\(n\)组整数\(a_i\)和\(b_i\),表示有一个人在\([a_i,a_i+b_i)\)登录。求\(\forallk\in[1,n]\),有\(k\)个玩家登录的天数。分析很明显的差分,但是因为\(a_i,b_i\le10^9\),不能直接开差分数组。注意到\(n\le2\times10^5\),所以可以用pair数组代替差分数组,......
  • 2024.03.22
    今天学习安卓的时间选择器时间选择器DatePickerHelperimportandroid.app.DatePickerDialogimportandroid.content.Contextimportandroid.widget.DatePickerimportandroid.widget.EditTextimportjava.text.SimpleDateFormatimportjava.util.Calendarimportjava.util.Loca......
  • 【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-系统服务-试卷
    2022年甘肃省职业院校技能大赛高职组网络系统管理竞赛系统服务模块试题目录一、竞赛介绍…1(一)环境登录…1(二)系统配置…1(三)竞赛环境…1二、竞赛注意事项…1三、竞赛结果文件的提交…2四、Linux项目任务描述…2(一)拓扑图…2(二)基本配置…3五、Linux项目任务清......
  • COMP226市场微观结构及其对交易
    COMP226课业1持续评估数字任务于2024年2月26日星期一发布截止日期:2024年3月22日星期五21:00提交模式将单个R文件“solution.R”提交到画布上的CodeGrade分配学习成果评估了解市场微观结构及其对交易的影响。任务目标从订单信息中重建限额订单簿;计算数量基于限额订单簿标准截止日......