Spring Ldap

SpringLdap创建用户/组的基本操作(详细) 最近公司要实现AD域的自动化,列了一些需求清单,自己也在学习ldap中,希望大家交流一下。 1. 用户 @Entry(objectClasses = {"user", "organizationalPerson", "person", "top"}) public class AdUser { @Id @JsonIgnore private Name id; ... 阅读详情

Spring Ldap

  • Spring Ldap是一个用来简化LDAP操作的开源框架
  • Spring Ldap中的ODM技术可以像Hibernate的ORM一样将对象映射到AD域上
  • 该框架通过提供和ORM中相似的机制对LDAP相关操作进行封装,主要包括:
    • 类比SessionFactory的LdapContextSource
    • 类比HibernateTemplate等的LdapTemplate
    • 伪事务支持,能否与tx框架的TransactionManager混用未知
    • 类比JPA的使用@Entry、@Attribute、@Id标注的ODM——Object Directory Mapping
  • 本文的目的是通过Ldap操作获取AD域的组和用户
  • 文档:http://docs.spring.io/spring-ldap/docs/2.0.4.RELEASE/reference/

本文主要使用ODM技术映射对象,简化ObjectMapping操作,当然也可以不定义对象自己定义AttributesMapper,相关内容可以查看官方文档。

ORM映射

1.映射组织单位organizationalUnit

@Entry(objectClasses = { "organizationalUnit", "top" })
public final class Group {
    @Id
    @JsonIgnore // Name无法完全被转换成json字符串,所以不要转换
    private Name dn;

    @Attribute(name = "ou")
    private String groupName;

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

    // getter setter tostring...
}

2.映射用户

@Entry(objectClasses = { "organizationalPerson", "person", "top", "user" })
public class Person {
    @Id
    @JsonIgnore
    private Name dn;

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

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

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

    @Attribute(name = "managedObjects")
    private String managerObject;

    @Transient
    private String group;

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

    // getter setter tostring...
}

关于ODM的解释:
- @Entry定义一个Entry对象,映射AD域的对象信息, objectClasses 指定对象类属性,是一个数组
- @Id 类似于ORM中的@Id,但是在这里是指DN值(在AD域中DN值是唯一的)
- @Attribute指定Entry中的某一个属性值,没有指定@Attribute的属性为改属性名
- @Transient表示该属性不映射AD域中的某个属性
- @DnAttribute(value=”ou”, index = 1) 表示将DN值中的某一个值取出作为该变量值

下面定义一个Repository访问AD域信息:

@Component
public class CustomLdapRepositoryImpl implements CustomLdapRepository {

    private LdapTemplate ldapTemplate;

    // open a ldap connection
    private void openLdapConnection(LdapGroupServerInfo serverInfo) {
        String url = "LDAP://" + serverInfo.getIp() + ":"
                + serverInfo.getPort();
        LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl(url);
        contextSource.setUserDn(serverInfo.getDnName());
        contextSource.setPassword(new String(Base64.decode(serverInfo
                .getPassword().getBytes())));
        contextSource.setReferral("follow");
        contextSource.afterPropertiesSet();
        ldapTemplate = new LdapTemplate(contextSource);
        ldapTemplate.setIgnorePartialResultException(true);
    }

    @Override
    public List<Group> findGroupsByBase(LdapGroupServerInfo serverInfo,
            String base, int searchScope) {
        openLdapConnection(serverInfo);

        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(searchScope);

        LdapName ldapName = null;
        try {
            ldapName = new LdapName(base);
        } catch (InvalidNameException e) {
            e.printStackTrace();
        }

        return ldapTemplate.findAll(ldapName, searchControls, Group.class);
    }

    @Override
    public List<Person> findPersonsByBase(LdapGroupServerInfo serverInfo,
            String base, int searchScope) {
        openLdapConnection(serverInfo);
        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(searchScope);
        LdapName name = null;
        try {
            name = new LdapName(base);
        } catch (InvalidNameException e) {
            e.printStackTrace();
        }
        return ldapTemplate.findAll(name, searchControls, Person.class);
    }

    @Override
    public List<Person> findPersonsByEmail(LdapGroupServerInfo serverInfo,
            String base, String email) {
        openLdapConnection(serverInfo);
        // if no detail base attr, use server base to find
        if (base == null) {
            base = serverInfo.getBase();
        }

        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        LdapName name = null;
        try {
            name = new LdapName(base);
        } catch (InvalidNameException e) {
            e.printStackTrace();
        }

        AndFilter filter = new AndFilter();
        filter.and(new EqualsFilter("mail", email));

        return ldapTemplate.find(name, filter, searchControls, Person.class);
    }

    @Override
    public List<Person> findManagersByPersonDN(LdapGroupServerInfo serverInfo,
            String personDN) {
        openLdapConnection(serverInfo);

        personDN = personDN.substring(personDN.indexOf(",") + 1);

        SearchControls searchControls = new SearchControls();
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        LdapName name = null;
        try {
            name = new LdapName(personDN);
        } catch (InvalidNameException e) {
            e.printStackTrace();
        }

        AndFilter filter = new AndFilter();
        filter.and(new EqualsFilter("managedObjects", personDN));

        return ldapTemplate.find(name, filter, searchControls, Person.class);
    }

    @Override
    public boolean authenticateUser(LdapGroupServerInfo serverInfo,
            String userDN, String credentials) {
        openLdapConnection(serverInfo);

        DirContext ctx = null;
        try {
            ctx = ldapTemplate.getContextSource().getContext(userDN,
                    credentials);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            LdapUtils.closeContext(ctx);
        }
    }
    ...
}

上文主要是通过ldapTemplate来进行数据请求和处理的,需要先定义一个方法来开启ldap连接,通过contextSource来建立连接:
contextSource.setReferral(“follow”) 我们只需要部分数据,这个设置可以防止其报javax.naming.PartialResultException异常。
follow模式在多层级下会影响读取速度,可以设置为ignore。
contextSource.afterPropertiesSet() 表示不是基于配置模式来配置contextSource的。

至此,我们就可以通过这个Repository来进行数据交互了,当然还可以继续扩展改类来实现更多的功能。

Spring集成ldap的使用 1.首先在项目pom.xml文件引用maven依赖包: &lt;!-- spring-ldap --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ldap&lt;/groupId&gt; &lt;artifactId&gt;spring-ldap-core&lt;/artifactId&gt; &l... 阅读详情

相关推荐

LDAP实例项目详解:从基础到Java交互

本文还有配套的精品资源,点击获取 简介:LDAP是一个用于存储和检索分布式目录服务信息的轻量级目录访问协议。在IT领域,它被广泛应用于用户身份验证、权限管理和组织结构管理。本文实例将深入探讨使用Java语言与LDAP进行交互,并创建一个小型的项目,涵盖了LDAP的基础知识、Java与LDAP的交互方式、实现用户认证、权限管理、数据同步,以及安全考虑和扩展应用等关键内容。 ...

weixin_31938351的博客 2325

Spring ldap ODM

Spring ldap ODM 上文讲述了Spring-ldap基本操作,通过定义LdapTemplate这个bean到IOC容器,使用时注入LdapTemplate即可完成对LDAP目录树的CRUD及筛选、过滤等。 但是对于筛选查询出来的内容,JNDI是封装在Attributes中,尽管spring-ldap提供了AttributesMapper接口,让你自己去实现具体的从Attributes转成Java对象的逻辑,但是随着业务变化,对于不同的查询列,转化逻辑必须重新写。 那有没有办法,...

CarloPan的博客 721

ChatGPT Plus账号被降智?3个实用检测方法+终极解决方案(附国内支付指南)

本文针对ChatGPT Plus账号性能下降问题,提供了3个科学检测方法和系统级解决方案。通过详细分析症状、专业诊断技巧和优化策略,帮助用户有效应对GPT-4o等高级功能失效、响应质量下降等问题,特别包含国内用户关心的支付方案和账号管理建议。

weixin_42639633的博客 473

spring-ldap学习(二)

上一篇介绍了搭建ldap服务,通过GUI风格的ldapsoft ldap admin tool去连接ldap服务端以及介绍了spring-ldap的增删改查,本文将介绍spring data 式的风格去编码,使代码更加简洁,之前也写过一篇spring data mongodb,点击这里查看 spring data mongodb学习以及为repository提供可扩展的自定义方法 首先我们通过l

西楚小羽的专栏 2945

Zephyr、FreeRTOS 和 RT-Thread

你是…更适合用嵌入式新手,刚接触 RTOSFreeRTOS(入门简单)IoT 项目开发,需要 BLE/WiFi/MQTTZephyr(协议全)想快速构建可部署的产品Zephyr(模块统一)只做单个任务或简单状态机控制FreeRTOS(轻量)做平台化、持续集成、自动测试Zephyr(CI 支持强)

is0815的博客 2246

stm32 + freertos + c++混合编程方法

其他一些资料上面,c++配置成--cpp11或者-cpp 都是把工程配置成c++。三、添加cpp文件,我们调用cpp文件里面的接口函数,不需要修改main.c后缀名。2、配置工程编译时候是--c99,是因为工程里面FreeRTOS是c语言,c++模式会报错。我们这里是默认c,编写的c++文件,单独选择--cpp编译,这在后面配置!c++是面向对象编程,对于一些项目来说,c++编程更加合适!stm32cubemax配置,这里就不写了,配置资料比较多。这里就是让cpp文件在c++下编译。最后,编程成功,点亮!

yuhu0012的博客 2629

java spring ldap_Spring Boot 连接LDAP的方法

本文是Spring Boot系列文集中关于LDAP连接相关操作的一文。仅仅涉及基本的使用ODM来快速实现LDAP增删改查操作。详细的关于Spring LDAP的其他操作,可以参考翻译的官方文档。本文目的:使用Spring Boot构建项目,帮助读者快速配置并使用Spring LDAP操作LDAP。大致步骤如下:1.创建Spring Boot项目(约1分钟)2.添加pom.xml文件中Spring ...

weixin_33711871的博客 1465

黑五数据集实战:从消费者行为解码到零售智能决策

零售智能决策依赖对消费者行为的深度理解,其核心在于将结构化字段还原为真实商业动作。本文基于经典Black Friday数据集,系统阐释如何通过字段语义重定义、业务驱动的特征工程、轻量高效模型(如LightGBM)及定制化损失函数,构建可落地的库存预警、流失拦截与动线优化方案。重点融合‘消费人格指纹’与‘生态位稳定性分’两大热词,揭示数据背后的城市引力场、品类竞争网络与决策节奏图谱,为电商、快消及零售从业者提供从数据分析到业务闭环的完整方法论。

weixin_28630185的博客 345

Spring Data LDAP详解

LDAP是一种用于访问分布式目录服务的协议,常用于用户认证和存储用户信息。Spring Data LDAP作为Spring Data项目的一部分,旨在为Spring LDAP提供熟悉且一致的仓库抽象,简化了与LDAP服务器的交互过程。

专业深耕,技术前沿 1084

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份IEC61850通信协议从理论到实践的完整测试验证实战指南。针对MMS、GOOSE、SV三大核心协议,详细阐述了测试环境搭建、自动化脚本编写、性能与异常测试方法,并分享了常见避坑经验,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备在现场的互联互通与稳定可靠运行。

neovim7hacker的博客 156

大模型抽取知识图谱三元组的可行性分析

通过结合传统信息抽取模型与大语言模型的混合架构,可高效完成从学术文献到知识图谱三元组的全流程构建。分阶段优化:传统模型负责粗粒度抽取,大模型负责细粒度修正。灵活提示设计:通过少样本学习引导大模型理解领域本体。严格质量控制:结合规则引擎和人工校验,确保三元组准确性。该方案可显著提升知识图谱构建效率,适用于学术研究、企业知识库等场景。

qq_20647053的博客 1067

Spring LDAP的使用

LDAP入门http://www.jianshu.com/p/7e4d99f6baaf Spring LDAP,是Spring的一个组件,实现对LDAP的操作。 在编程操作MySQL时,我们除了用JDBC,可能都会选用一些框架,比如JbdcTemplate。 JdbcTemplate的实现是通过传入sql语句和RowMapper,query返回目标列表,或是传入sql和参数,执行update方法。JdbcTemplate的优点是简化了与数据库连接的代码,以及避免了一些常见的错...

CarloPan的博客 2258

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6463

Spring3 LDAP

Spring3 LDAP 这里介绍使用LDAP来校验用户 1.准备阶段 下载相关的jar spring-ldap-1.3.0.RELEASE-all.jar 可以去http://www.springsource.org/ldap/这里下载。 2.配置相关 <bean id="contextSource" class="org.springframework.l

fover717的专栏 3456

机器学习kaggle报告-Facial Keypoints Detection【完整解题过程+代码】

在处理面部关键点检测任务时,首先需要将存储在 CSV 文件中的图像数据转换为可以显示和分析的图像。数据集中每个图像是以一个一维数组的形式存储,其中包含了图像的所有像素值。为了将这些数据转化为实际的图像,我们需要按照一定的规则将这些像素值重新排列为一个二维矩阵(即图像的行列)。下面是一个案例,展示了如何将数据集中的图像数据转化为图片。转化过程读取CSV文件:首先,我们需要读取包含图像数据的 CSV 文件,通常该文件包含多张图像的像素值。每一行表示一张图像,并且包含图像的像素值列表。提取图像数据。

一键难忘的博客 3353

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Spring】【Ldap】Spring-ldap连接ldap

&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ldap="http://www.s

Sheldon74的博客 712

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java spring ldap_Spring Boot连接LDAP服务器

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,是一个开放、厂商中立的行业标准应用协议,其通过 IP 网络访问和维护分布式目录信息服务。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在...

weixin_35433770的博客 1407

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spring-ldap

  spring ldap最近一直在弄spring 与lapd的配置,上网查了不少资料,大部分中文的资料都是相似的,而且讲的也不是很好,有的只给个配置文件,连个测试类都不给下。好不容易找了个英文的,觉得讲的不错,(http://www.javaworld.com/javaworld/jw-06-2007/jw-06-springldap.html?page=2 ),完完

hoho19840130的专栏 4273

Spring和Ldap整合详解

Spring和Ldap整合详解 官方主页 Spring Spring Ldap 概述 LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。 目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。 目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改...

feiyangtianyao的专栏 1万+

Security——Spring LDAP

Spring LDAP

十年梦归尘的专栏 671

【总结】Spring LDAP整理

如果要总结Spring的LDAP(Spring开发的操作LDAP的开源Jar),必须要从LDAP说起。 LDAP:Lightweight Directory Access Protocol,翻译过来是轻量级目录访问协议。 它是基于X.500标准的(X.500:构成全球分布式名录系统的协议),说的这么抽象基本上理解不了,只需要知道是一种协议,以目录的形式(结构树)来管理资原(用户、用户组、地...

angelbill3的专栏 838

java spring ldap_Spring LDAP的使用

Spring LDAP,是Spring的一个组件,实现对LDAP的操作。在编程操作MySQL时,我们除了用JDBC,可能都会选用一些框架,比如JbdcTemplate。JdbcTemplate的实现是通过传入sql语句和RowMapper,query返回目标列表,或是传入sql和参数,执行update方法。JdbcTemplate的优点是简化了与数据库连接的代码,以及避免了一些常见的错误。同样的,...

weixin_36408867的博客 421

Spring-ldap 操作LDAP

Spring-ldap 操作LDAP:  Spring-ldap 地址: http://www.springsource.org/ldap/(进入) Spring 版本: spring-framework-2.5.6 Spring-ldap 版本:  spring-ldap-1.3.1 所需Spring的jar包: spring.jar 所需Spring-ldap的jar包: spr

记事本 1万+

Spring LDAP 实践教程(一)

原文:Practical Spring LDAP 协议:CC BY-NC-SA 4.0 零、简介 实用的 Spring LDAP 提供了 Spring LDAP 的完整覆盖,这是一个旨在减轻 LDAP 编程之苦的框架。这本书首先解释 LDAP 的基本概念,并向读者展示如何设置开发环境。然后深入到 Spring LDAP,分析它要解决的问题。在那之后,这本书将重点放在单元测试和集成测试 LDAP 代码的实践方面。接下来是对 LDAP 控件和新的 Spring LDAP 1.3.1 特性的深入研究,比如对象

龙哥盟 1473
上一篇: JavaMockito的使用
下一篇: Spring4整合Quartz2实现定时任务
Macarron
博客等级 码龄12年 8粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值