windows下搭建LDAP并利用Java实现对LDAP的操作

什么是LDAP,百度百科一堆专业术语的描述。

我总结为一句话:轻量级目录访问协议,有数据库的数据存储功能,以树状层次型存储方式,就好像你的电话薄那样。

在一次项目中,由于该项目是教育性管理项目,客户要求项目必须部署在内网。那么在内网的话,就代表用户需要去拨VPN才能进行内网的访问。

其实当时我想到的是,单独开个注册映射到外网,让用户自己注册,管理员进行审核,然后用VPN去读数据库中的账号和密码就行了。这样,我们的系统和vpn就

相当于统一账号。但是当我确认需求的时候,那个老师告诉我们,他不会读什么数据库,他能够LDAP或者windows域,当时我直接蒙逼了。没听过这个,最后花时间

看了下,发现也不是那么吊。切入正题

(1) 在官网上下载LDAP并安装,注意两点,1、第二步你输入的密码一定要记着,默认是secret;2、到“backend configuration” 这一步的时候,选择“BDB”

其他的你就一直下一步。安装完成的LDAP 默认是启动。你不用管他

(2)找到你安装的LDAP位置,找到“slapd.conf”这个配置文件。打开它。

里面有两行默认的配置

suffix   "dc=maxcrc,dc=com"

rootdn  "cn=Manager,dc=maxcrc,dc=com"

这两行东西其实是可以随便改的。只要能和你接下来要导入的conf文件中的配置匹配就可以。

其实,上面的两行属性可以理解为用户名和匹配项,用户名:cn=manager,匹配项:dc=maxcrc,dc=com

(3)写一个ynjy.conf文件

利用这个文件,你可以导入你的初始ldap的管理员

dn: uid=lrd,ou=People,dc=maxcrc,dc=com
uid: lrd
objectClass: inetOrgPerson
mail: [email protected]
userPassword: 123456
labeledURI: http://www.maxcrc.com
sn: Sun
cn: lrd Sun

上面的uid就类似于你的标示,ou=People,类似于你的电话薄名儿,里面存什么待会儿我们利用java来进行添加。

dc=maxcrc,dc=com  这句必须要和你的“slapd.conf”中的匹配,就是我上面说的匹配项。

注意点来了,LDAP可以自定义属性,通过schema自定义,但初次不要去试,因为容易失败,ldap的资料还是比较少。解决问题有时候摸不着头绪

ldap提供了本身自带的属性,就是我们上的uid,mail,userPassword,labeledURI,sn,cn等,,记住,这几个属性必须不能改它。大小写都认。不然导不进去。

(4)导入ynjy.conf进入ldap

cmd进入命令窗口,定位到你的ldap目录中

输入命令:ldapadd -x -D "cn=Manager,dc=maxcrc,dc=com" -w secret -f ynjy.ldif

你会看见执行条目成功的提示

你可以下载一个ldapBrowser进行查看。

上面的初步ldap平台的准备工作就完了

接下来,我们准备Java的访问

其实和连接JDBC方式是一样的。注意的就是LDAP的cn,dc这些属性要匹配。相当于账号!!!

我就直接将我的LDAPHelper代码贴出来。并且附上一段简单将数据读进LDAP中的代码

package util;

import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class LDAPHelper {
private final String URL = "ldap://192.168.2.19:389/";
private final String BASEDN = "ou=People,dc=maxcrc,dc=com"; // 根据自己情况进行修改
private final String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
private LdapContext ctx = null;
private final Control[] connCtls = null;

private void LDAP_connect() {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
env.put(Context.PROVIDER_URL, URL + BASEDN);
env.put(Context.SECURITY_AUTHENTICATION, "simple");

String root = "cn=Manager,dc=maxcrc,dc=com"; //根据自己情况修改
env.put(Context.SECURITY_PRINCIPAL, root); // 管理员
env.put(Context.SECURITY_CREDENTIALS, "daqsoft"); // 管理员密码

try {
ctx = new InitialLdapContext(env, connCtls);
System.out.println( "连接成功" );

} catch (javax.naming.AuthenticationException e) {
System.out.println("连接失败:");
e.printStackTrace();
} catch (Exception e) {
System.out.println("连接出错:");
e.printStackTrace();
}

}
private void closeContext(){
if (ctx != null) {
try {
ctx.close();
}
catch (NamingException e) {
e.printStackTrace();
}

}
}
private String getUserDN(String uid) {
String userDN = "";
LDAP_connect();
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

NamingEnumeration<SearchResult> en = ctx.search("", "uid=" + uid, constraints);

if (en == null || !en.hasMoreElements()) {
System.out.println("未找到该用户");
}
// maybe more than one element
while (en != null && en.hasMoreElements()) {
Object obj = en.nextElement();
if (obj instanceof SearchResult) {
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + BASEDN;
} else {
System.out.println(obj);
}
}
} catch (Exception e) {
System.out.println("查找用户时产生异常。");
e.printStackTrace();
}

return userDN;
}

public boolean authenricate(String UID, String password) {
boolean valide = false;
String userDN = getUserDN(UID);

try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ctx.reconnect(connCtls);
System.out.println(userDN + " 验证通过");
valide = true;
} catch (AuthenticationException e) {
System.out.println(userDN + " 验证失败");
System.out.println(e.toString());
valide = false;
} catch (NamingException e) {
System.out.println(userDN + " 验证失败");
valide = false;
}
closeContext();
return valide;
}

public boolean addUser(String usr, String pwd,String uid,String description) {
try {
LDAP_connect();
BasicAttributes attrsbu = new BasicAttributes();
BasicAttribute objclassSet = new BasicAttribute("objectclass");
objclassSet.add("inetOrgPerson");
attrsbu.put(objclassSet);
attrsbu.put("sn", usr);
attrsbu.put("cn", usr);
attrsbu.put("uid", uid);
attrsbu.put("userPassword", pwd);
attrsbu.put("description", description);
ctx.createSubcontext("uid="+uid+"", attrsbu);

return true;
} catch (NamingException ex) {
ex.printStackTrace();
}
closeContext();
return false;
}

//测试
public static void main(String[] args) {
LDAPHelper ldap = new LDAPHelper();

//ldap.LDAP_connect();

if(ldap.authenricate("yorker", "daqsoft") == true){

System.out.println( "该用户认证成功" );

}
//ldap.addUser("yorker","secret");

}
}

上面的代码是我从另外一张表获得的用户信息写进了ldap。

ldap的操作就介绍完毕。有问题的大家可以一起讨论。我也是刚用到将这个东西勉强用起来

时间: 2024-12-19 20:02:26

windows下搭建LDAP并利用Java实现对LDAP的操作的相关文章

windows下搭建和配置java环境

基于很多原因,还是得说说java环境的搭建和配置. 1.下载JDK: jdk和jre的区别:jre表示运行环境,jdk除了运行环境,还带有调试开发环境. 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 这边主要讲解jdk7的安装. 此外http://www.oracle.com/technetwork/java/javase/downloads/index.html  这

Windows下搭建Openvpn使用用户名和密码验证方式如何引用shell脚本

网上找了很多资料关于Openvpn使用用户名和密码验证方式的大都是在linux环境下搭建的.其实在windows下搭建可以参考linux的情况,可以找到很多资料,主要遇到的问题是如何引用那个checkpw.sh的shell脚本.这里记下自己的经验. 为了引用此脚本,看了网上一个博客后有了点idea.首先安装Cygwin,Cygwin是一个在windows平台上运行的类UNIX模拟环境.之后写一个bat文件,如script.bat: C:/cygwin64/bin/bash.exe  C:/che

Windows下搭建MySql Master-Master Replication

1.首先下载最新版的MySql Server (http://dev.mysql.com/downloads/windows/installer/) 2.安装MySql Server到两台机器上 MySql 1: 192.168.0.104 (以下简称104) MySql 2: 192.168.0.103  (以下简称103) 3. 配置Mysql Server启动Binary Logging. 在104的my.ini文件(一般在C:\ProgramData\MySql\MySql Server

C++开发安卓、windows下搭建Android NDK开发环境

1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个工具,我们可以把用C/C++代码编译成可以直接运行在Android平台上的本地代码,这些本地代码以动态链接库( *.so )的形式存在,也正因为这样,我们可以通过复用这些动态链接库从而复用本地代码. 那么,通过NDK这个开发工具包,那么我们是否可以将一个APK完全使用C/C++来编写呢? 答案是不可

windows下双击可运行的Java软件打包方案(转)

出处: http://www.cnblogs.com/shiyangxt/ 刚开始学Java的时候,挺郁闷的,写出来的java类文件,需要dos下编译,然后再dos下运行看效果.这使初学者常常 觉得麻烦,学习的深入以后,会接触到eclipse.netbean和一些插件IDE产品.极大的方便了java的编写,但是随着自己写的程序 越来越大,渐渐成项目和软件的时候,就需要常常和jar文件打交道.渐渐的想让java文件的执行更痛快点,不想给其他人演示个小 软件还要在IDE里看效果,十分的不帅.现在整理

Windows下搭建android+phonegap环境

随着2014年公司桐庐之旅开始,在一片欢声笑语中回到了★★★★★宾馆.等待的是晚上的酒场,先写个开头语.晚上酒足饭饱后进入正文. 不好意思兄弟们,来迟了.本次主要是windows下搭建android+phonegap的环境搭建. 下面首先进行android环境的搭建: 1.JDK的安装: a.先下载jdk b. 安装JDK的步骤只要下一步就可以. c.配置环境变量 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量: JAVA_HOME值为: C:\Program

windows下搭建nginx-rtmp服务器

windows下搭建nginx-rtmp服务器 windows下搭建nginx-rtmp服务器 准备工作 安装MinGW 安装Mercurial 安装strawberryperl 安装nasm 下载nginx相关的源码包 编译nginx nginx-rtmp环境搭建 效果测试 最后说明 最近因为接触直播相关的技术工作,使用的也是基于高并发和高性能的nginx,首先需要做的当然是搭建一个nginx服务器. 对于linux上nginx服务器的搭建此处就不再赘述,按照操作指引来的话一般都能顺理成章搭建

本地windows下搭建git的本地服务器

本地windows下搭建git的本地服务器 准备工作: 本地安装java环境,配置环境变量(略) 下载gitblit文件,百度一大堆 开始第一步: 减压gitblit压缩包到某个目录下,比如我在:H:\gitblit 第二步: 修改gitblit安装目录下的data文件下的gitblit.properties 第17行处:include = defaults.properties 修改为 include = my.properties 第三步: 从data文件夹下找到defaults.prope

Windows下搭建PHP开发环境

Windows下搭建PHP开发环境 一.准备工作-所需软件 ·   Apache  \php\httpd-2.2.25-win32-x86-no_ssl.msi ·   PHP \php\php-5.3.1-Win32-VC6-x86.zip ·   Oracle client 10g\php\client 二.安装软件 安装Apache: 双击安装,与安装其他Windows软件没有什么区别,在填Server Infomation时,并没有特殊规定,只要输入的信息符合格式即可. 安装完成之后,在