Spring-Ldap连接Ldap及简单的增删查改

了解了Ldap的基本概念之后就是Ldap的使用问题了,就像连接MySQL数据库,操作MySQL数据库中数据一样,我们怎么连接到Ldap呢?又是怎么操纵ldap中的数据呢?

我也是不断的在网上查找资料,最终选择使用Spring-ldap进行数据库的连接,因为我的项目使用SpringMVC+Spring开发,直接就利用Spring-ldap了,挺简单的。

步骤一:依赖(maven工程)

<!-- 添加Spring 对LDAP的支持 -->
      <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-core</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-odm</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-core-tiger</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-ldif-batch</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.ldap</groupId>
            <artifactId>spring-ldap-ldif-core</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>

步骤二:在Spring配置文件中配置Ldap数据源,类似于配置MySQL数据源一样

<!--配置数据源-->
<bean  id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
        <property name="url" value="ldap://localhost:389" />
        <property name="base" value="ou=citizen,dc=tcs,dc=com" />
        <property name="userDn" value="cn=Manager,ou=citizen,dc=tcs,dc=com" />
        <property name="password" value="secret" />
        <property name="referral" value="follow"></property>
    </bean>
   <!--配置LdapTemplate,类似于JDBCTemplete-->
    <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate" >
        <constructor-arg>
            <ref bean="contextSource" />
        </constructor-arg>
    </bean>

   <!---配置一个dao--->
    <bean id="ldapPerson" class="com.tcs.cloud.platform.Dao.LdapPersonDaoImpl">
        <property name="ldapTemplate">
            <ref bean="ldapTemplate" />
        </property>
    </bean>

步骤三:创建实体对象

步骤四:创建Dao接口,以及DaoImpl实现类:

实现类实现简单的增删查改:此处借鉴:http://jueshizhanhun.blog.51cto.com/4372226/1232271/

帮助文档中开篇的那一大串的代码就不详细说,碰到再解释,下面为简化后的那段代码。

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

/*注入*/

public void setLdapTemplate(LdapTemplate ldapTemplate) {

this.ldapTemplate = ldapTemplate;

}

/** 可返回所有根地址,对象类型为persopn的信息的cn属性值*/

public List getAllPersonNames() {

/*search方法中设计到三个参数,第一个是dn(类似于路径url),

* 这里为空是因为 我们之前XML中已经配置了根地址,

* 第二个就是对象类型,第三个是要查询之后返回的信息*/

return ldapTemplate.search( "", "(objectclass=person)",

new AttributesMapper() {

public Object mapFromAttributes(Attributes attrs)

throws NamingException {

return attrs.get("cn").get();

}

});

}

}

最后会得到一个List集合 里面存有"CN"对应的值。

接下来就是第二章的简单增删改查功能,首先根据文档继续说下查找的功能,文档描述的 我看了N遍才弄懂(好笨。。)。

上面说到search的方法需要三个参数,接下来就对它的这三个参数进行一个简单的封装。

首先是封装dn,我理解为url地址。文档中是这样封装放在想在

package com.example.dao;

import org.springframework.ldap.core.support.DistinguishedName;

import javax.naming.Name;

public class PersonDaoImpl implements PersonDao {

/*这里就是我之前在XML中提到的可以把根目录放在项目中使用*/

public static final String BASE_DN = "dc=example,dc=com";

/*定义个dn的方法,返回类型是Name形式*/

protected Name buildDn(Person p) {

DistinguishedName dn = new DistinguishedName(BASE_DN);//初始化时可以把根写上,也可写放在下面。

dn.add("c", p.getCountry());   //跟前面的路径(国家)

dn.add("ou", p.getCompany());  //c前面的路径(公司)

dn.add("cn", p.getFullname()); //在ou前面的路径(你创建的该信息的路径)

return dn; //创建好之后就会返回一个dn可以直接放在search中

}

}

dn的样式大致是这样的 :

cn=Some Person, ou=Some Company, c=Sweden, dc=example, dc=com

这个路径就是你将来也许会用很多次的路径 。。。

不过这里有跟致命的问题 当先去查找P的属性 再去更新,新增的时ou和c的属性是查不到的,这里坑了我半天,我后来也没有去测试如何应该把ou和c的属性放在p的属性了,因为我一直没找到对应的属性名字,所以我后来直接把路径写成常量。。。(有知道请回复,3q)

接下来说第二个参数的封装

AndFilter filter = new AndFilter();

/*可以理解为查询条件的过滤器,比如sql中的where子句,但下面的关于objectclass的属性是必须写的,理解为1=1吧*/

filter.and(new EqualsFilter("objectclass", "person"));

/*这里创建里一个模糊查询条件方法并输入查询条件,该方法同等于

new LikeFilter("cn","*cn*")方法,可以理解为sql中的like子句*类似% */

filter.and(new WhitespaceWildcardsFilter("cn", "cn"));

上吧我把第二个cn处多家了二个" 是为了让大家知道这里是字符串格式

下面我说就说下第三个参数的封装吧

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

...

/*创建一个结果类,继承AttributesMapper接口,重写他的方法*/

private class PersonAttributesMapper implements AttributesMapper {

public Object mapFromAttributes(Attributes attrs) throws NamingException {

/*这里创建一个person对象是为了返回时可以直接返回实体,如果多个实体,他会成集合形式*/

Person person = new Person();

/*这里是将你查找到的信息中属性名字对应的值放在你的实体对象中,并一同返回。*/

person.setFullName((String)attrs.get("cn").get());

person.setLastName((String)attrs.get("sn").get());

person.setDescription((String)attrs.get("description").get());

return person;//返回你的实体

}

}

/*文档中的案例,使用结果类的方法*/

public List getAllPersons() {

return ldapTemplate.search("", "(objectclass=person)", new PersonAttributesMapper());

}

}

以上就是search方法中的三个参数封装,学的时候真蒙啊,现在看看来不过如此。

接下来讲下新增 bind方法

在刚才我们封装查找的三个参数,下面新也同样有三个方法:

1.dn(老相识了),2.一个object类型的参数 文档给的是null,真心不知道是什么玩应(不理会)

3.一个属性的类,要创建的属性都在这里。

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

...

public void create(Person p) {//创建方法

Name dn = buildDn(p);    //调用之前封装dn的方法获得dn

ldapTemplate.bind(dn, null, buildAttributes(p));

}

/*设置需要创建的属性,objectclass的对象类属性应该是必有的*/

private Attributes buildAttributes(Person p) {

Attributes attrs = new BasicAttributes(); //创建一个属性集

BasicAttribute ocattr = new BasicAttribute("objectclass");

ocattr.add("top");   //这个属性数必须有,就算在服务器手写创建代码时也需要添加它

ocattr.add("person"); //创建的对象类

attrs.put(ocattr);    //将属性集添加到属性中

attrs.put("cn", "Some Person");  //输入 cn属性  对应后台的姓的值

attrs.put("sn", "Person"); // 对应后台的常用名

return attrs;  //返回你获得的属性

}

}

虽然创建的方法bind中需要是三个参数,但是实际使用的两个参数,第一个为地址,第二个null,第三个是要插入的属性

接下来我们看下 删除,这个是简单的方法,可以理解为DAO中根据id进行删除一个实体就OK了

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

...

public void delete(Person p) {

Name dn = buildDn(p); //根据你的用户信息获得你的dn

ldapTemplate.unbind(dn); //根据路径删除这条信息

}

}

接下来就更新了,有两成方式,一种是暴力型,一种是简单更换型。

下面的是暴力型

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

...

public void update(Person p) {

Name dn = buildDn(p);

ldapTemplate.rebind(dn, null, buildAttributes(p));

}//只有rebind方法名不同,看名字就知道是重新绑定用户信息,意思是先kill掉用户然后重新添加一个,(太掺不忍睹了,没考虑过性能,如果方便的话貌似也可以。。。。。。。)

}

接下来就是真正的更新。

package com.example.dao;

public class PersonDaoImpl implements PersonDao {

private LdapTemplate ldapTemplate;

...

public void updateDescription(Person p) {

Name dn = buildDn(p);

/*同样也封装了个修改的方法,但是他把这个方法放在了里面*/

/*设置修改的属性,但这里只能修改一个属性就新建一个不能用Attributes(至少我没用过,因为后面有更好的方法)*/

Attribute attr = new BasicAttribute("description", p.getDescription())

/*修改的类 将需要修改的属性放在里面*/

ModificationItem item = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr);

/*进行修改 创建一个修改条件,他是ModificationItem[]数组格式 所以要同时更新两个属性 就要 创建两个ModificationItem 然后放进数组 */

ldapTemplate.modifyAttributes(dn, new ModificationItem[] {item});

}

}

OK这就是简单增删改查。

时间: 2024-08-28 19:56:09

Spring-Ldap连接Ldap及简单的增删查改的相关文章

Spring Boot集成ElasticSearch实现简单的增删查改接口

SpringBoot集成ElasticSearch pom.xml文件中,依赖的各jar包版本如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> &l

asp.net MVC最简单的增删查改!(详)

折腾了两天搞出来,但原理性的东西还不是很懂,废话不多说上图上代码 然后右键models,新建一个数据模型 注意我添加命名为lianxi 添加后如上 接下来在controllers添加控制器还有在Views中添加视图 注意控制器lianxi和视图的名字要一致,然后视图我是添加了3个分别是Index,insert,Modify,在控制器里分别有三个对应的函数 每当用URL访问视图时,他就调用了controllers对应的方法,例如 jiaEntities 就是建立模式时那个数据链接的名字      

nodejs连接mysql并进行简单的增删查改

最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs中的mysql模块 npm install mysql 在连接数据库之前,要先引入nodejs连接处理mysql的模块 var mysql = require('mysql'); 类似php连接mysql的方式,编写连接代码 //使用nodejs处理mysql的模块,使用创建连接方法,创建与mysq

mybatis实现简单的增删查改

接触一个新技术,首先去了解它的一些基本概念,这项技术用在什么方面的.这样学习起来,方向性也会更强一些.我对于mybatis的理解是,它是一个封装了JDBC的java框架.所能实现的功能是对数据库进行增删查改的功能. 首先,需要搭建一个demo,用于学习这个框架的使用方式.(1)在IDE上建立自己的工程目录,一个普通的java工程项目就好,我电脑本地的IDE是Myeclipse.(2)引入搭建框架需要的jar包,这个直接去网上搜索就好.(3)框架的核心实现都是基于配置的,引入jar包后,先配置my

通过JDBC进行简单的增删查改

目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操作 (1)定义记录的类(可选) (2)连接的获取 (3)insert (4)update (5)select (6)delete 四.测试 五.代码分析 六.思考问题 前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的

Hibernate 的事物简单的增删查改

Hibernate 是一个优秀的ORM框架体现在: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化. 2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对

简单的增删查改

package com.pro.dao.impl; import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.sql.Connection;import java.sql.Types;import java.util.Vector; import oracle.

java--easyUI+struts+JSP实现简单的增删查改

1.数据库工具类 package com.xiaoxiong.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnUtil { //定义连接数据库参数 private static String drivers = "com.mysql.jdbc.Driver"; private static String url

java--easyUI+struts+JSP实现简单的增删查改(增)

1.entity类 package com.xiaoxiong.entity; public class Dept { private Integer deptno; private String dname; public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public String getDname() { return