- 浏览: 557873 次
- 性别:
- 来自: 安徽
文章分类
最新评论
-
baynjh:
jp.ne.so_net.ga2.no_ji.jcom.JCo ...
java应用jcom将word转pdf -
zgw06629:
你好,请问你都做了哪些修改呢?是在客户端还是服务端?
http上传文件深度解析-高性能http传输 -
eidolon:
翻译有误。 l ?:意思是操作符左边的符号( ...
BNF 和EBNF的含义与用法(感谢译者:Sunnybill) -
huoyj:
请教一个问题,是不是HTTP请求里面没有包含上传文件在客户端的 ...
http上传文件深度解析-高性能http传输 -
a49688448:
“认清” 我还以为google怎么你了
最近终于认清了google
我们部门有一个系统是专门用来记录大家的请假和加班的.这个系统有一套用户名和密码,我们员工每个人都有一个公司统一分配的ID和密码.大家都觉得既然有统一的ID和密码,为什么还要多记一套登录口令呢?能不能试着把它们的验证系统统一起来,只用Intranet ID 和密码登录就行呢?
我接到这个任务之后,就开始着手进行调查.首先了解到公司另一个部门有一套系统,能够实现Intranet ID登录.我就和那个系统的负责人联系,几封邮件往来之后,得知他们用的是一种叫到 LDAP 的技术.但他们是用的基于Notes平台的,而我们的系统是基于JSP + Tomcat的,他说他也帮不了太多忙.
LDAP,一个我从来没有听说过的名词,只好从0开始学习.首先在百度百科里找到了关于它的一个比较详细的解释.通过那篇文章,我对LDAP是什么,能干什么有了比较清晰的了解.接下来就是上网找一些程序,首先找到的是一些如何操作LDAP的程序,但这需要一个管理员帐号和密码.这可把我给难住了,这么大一个公司,员工那么多,我不可能轻易拿到管理员级的帐号.
我们部门还有另一个项目,他们在维护一个系统,这个系统也能实现Intranet ID 登录.不过他们的系统是用PHP写的,和我要找的东西还是没有太多直接联系.不过我从他们那里拿到了登录的源代码,通过研究源代码,我认识到不需要管理员级的帐号就可以实现用户Intranet ID登录.而且我还从源代码里找到了公司员工信息的LDAP server的URL 和根DN.
但是当我用这些信息和自己的Intranet ID 和密码登录时,总是不成功,说是密码不对.但是,密码是没有问题的,因为我可以在别的系统里正常登录.我觉得问题还是出在用户名上.我就开始猜用户名到底是什么样的格式? 直接用 "yourname@myourdoain.com" 不行,用 "mail=yourname@myourdoain.com" 也不行.加上根DN, "mail=yourname@myourdoain.com,ou=catalogue,o=test.com", 还是不行. 后来经过不知多少次的尝试,终于发现每个员工都对应一个节点,这个节点有一个名字,你可以用下面的方法得到这个名字,用这个名字再加上根DN就可以了,
SearchResult si = (SearchResult) obj;
userDN = si.getName();
就像这样: "uid=123456,c=cn,ou=catalogue,o=test.com" .
最后总结出的思路就是先匿名登录LDAP服务器,查询到用户的一些必要信息,组装成登录用的用户ID,然后再用组装好的ID和用户输入的密码重新连接LDAP服务器,成功则表示用户名和密码正确,否则表示用户信息输入错误.
源代码如下,仅供参考:
package com.test.ldap;
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
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 UserAuthenticate {
private String URL = "ldap://localhost:389/";
private String BASEDN = "ou=catalogue,o=test.com";
private String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
private LdapContext ctx = null;
private Hashtable env = null;
private Control[] connCtls = null;
private void LDAP_connect(){
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,FACTORY);
env.put(Context.PROVIDER_URL, URL+BASEDN);//LDAP server
env.put(Context.SECURITY_AUTHENTICATION, "simple");
//此处若不指定用户名和密码,则自动转换为匿名登录
try{
ctx = new InitialLdapContext(env,connCtls);
}catch(javax.naming.AuthenticationException e){
System.out.println("Authentication faild: "+e.toString());
}catch(Exception e){
System.out.println("Something wrong while authenticating: "+e.toString());
}
}
private String getUserDN(String email){
String userDN = "";
LDAP_connect();
try{
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration en = ctx.search("", "mail="+email, constraints); //The UID you are going to query,* means all nodes
if(en == null){
System.out.println("Have no NamingEnumeration.");
}
if(!en.hasMoreElements()){
System.out.println("Have no element.");
}
while (en != null && en.hasMoreElements()){//maybe more than one element
Object obj = en.nextElement();
if(obj instanceof SearchResult){
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + BASEDN;
}
else{
System.out.println(obj);
}
System.out.println();
}
}catch(Exception e){
System.out.println("Exception in search():"+e);
}
return userDN;
}
public boolean authenricate(String ID,String password){
boolean valide = false;
String userDN = getUserDN(ID);
try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,password);
ctx.reconnect(connCtls);
System.out.println(userDN + " is authenticated");
valide = true;
}catch (AuthenticationException e) {
System.out.println(userDN + " is not authenticated");
System.out.println(e.toString());
valide = false;
}catch (NamingException e) {
System.out.println(userDN + " is not authenticated");
valide = false;
}
return valide;
}
}
我接到这个任务之后,就开始着手进行调查.首先了解到公司另一个部门有一套系统,能够实现Intranet ID登录.我就和那个系统的负责人联系,几封邮件往来之后,得知他们用的是一种叫到 LDAP 的技术.但他们是用的基于Notes平台的,而我们的系统是基于JSP + Tomcat的,他说他也帮不了太多忙.
LDAP,一个我从来没有听说过的名词,只好从0开始学习.首先在百度百科里找到了关于它的一个比较详细的解释.通过那篇文章,我对LDAP是什么,能干什么有了比较清晰的了解.接下来就是上网找一些程序,首先找到的是一些如何操作LDAP的程序,但这需要一个管理员帐号和密码.这可把我给难住了,这么大一个公司,员工那么多,我不可能轻易拿到管理员级的帐号.
我们部门还有另一个项目,他们在维护一个系统,这个系统也能实现Intranet ID 登录.不过他们的系统是用PHP写的,和我要找的东西还是没有太多直接联系.不过我从他们那里拿到了登录的源代码,通过研究源代码,我认识到不需要管理员级的帐号就可以实现用户Intranet ID登录.而且我还从源代码里找到了公司员工信息的LDAP server的URL 和根DN.
但是当我用这些信息和自己的Intranet ID 和密码登录时,总是不成功,说是密码不对.但是,密码是没有问题的,因为我可以在别的系统里正常登录.我觉得问题还是出在用户名上.我就开始猜用户名到底是什么样的格式? 直接用 "yourname@myourdoain.com" 不行,用 "mail=yourname@myourdoain.com" 也不行.加上根DN, "mail=yourname@myourdoain.com,ou=catalogue,o=test.com", 还是不行. 后来经过不知多少次的尝试,终于发现每个员工都对应一个节点,这个节点有一个名字,你可以用下面的方法得到这个名字,用这个名字再加上根DN就可以了,
SearchResult si = (SearchResult) obj;
userDN = si.getName();
就像这样: "uid=123456,c=cn,ou=catalogue,o=test.com" .
最后总结出的思路就是先匿名登录LDAP服务器,查询到用户的一些必要信息,组装成登录用的用户ID,然后再用组装好的ID和用户输入的密码重新连接LDAP服务器,成功则表示用户名和密码正确,否则表示用户信息输入错误.
源代码如下,仅供参考:
package com.test.ldap;
import java.util.Hashtable;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
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 UserAuthenticate {
private String URL = "ldap://localhost:389/";
private String BASEDN = "ou=catalogue,o=test.com";
private String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
private LdapContext ctx = null;
private Hashtable env = null;
private Control[] connCtls = null;
private void LDAP_connect(){
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,FACTORY);
env.put(Context.PROVIDER_URL, URL+BASEDN);//LDAP server
env.put(Context.SECURITY_AUTHENTICATION, "simple");
//此处若不指定用户名和密码,则自动转换为匿名登录
try{
ctx = new InitialLdapContext(env,connCtls);
}catch(javax.naming.AuthenticationException e){
System.out.println("Authentication faild: "+e.toString());
}catch(Exception e){
System.out.println("Something wrong while authenticating: "+e.toString());
}
}
private String getUserDN(String email){
String userDN = "";
LDAP_connect();
try{
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration en = ctx.search("", "mail="+email, constraints); //The UID you are going to query,* means all nodes
if(en == null){
System.out.println("Have no NamingEnumeration.");
}
if(!en.hasMoreElements()){
System.out.println("Have no element.");
}
while (en != null && en.hasMoreElements()){//maybe more than one element
Object obj = en.nextElement();
if(obj instanceof SearchResult){
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + BASEDN;
}
else{
System.out.println(obj);
}
System.out.println();
}
}catch(Exception e){
System.out.println("Exception in search():"+e);
}
return userDN;
}
public boolean authenricate(String ID,String password){
boolean valide = false;
String userDN = getUserDN(ID);
try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,password);
ctx.reconnect(connCtls);
System.out.println(userDN + " is authenticated");
valide = true;
}catch (AuthenticationException e) {
System.out.println(userDN + " is not authenticated");
System.out.println(e.toString());
valide = false;
}catch (NamingException e) {
System.out.println(userDN + " is not authenticated");
valide = false;
}
return valide;
}
}
发表评论
-
java获取项目路径
2010-12-16 13:40 1224在jsp和class文件中调用的相对路径不同。 在jsp里,根 ... -
CSS控制DIV圆角
2010-12-09 15:51 1925<!DOCTYPE HTML PUBLIC " ... -
强大的web打印功能
2010-08-24 11:17 11481.<html> 2.<head> ... -
一个java写的托盘练习
2010-08-14 15:48 1013package minsize;import javax.sw ... -
Java的SystemTray类的使用方法
2010-08-14 15:38 3342Java的SystemTray类的使用方法 JDK1.6版增 ... -
Hibernate中发生"Session is closed" 的另一种可能!
2010-07-17 23:39 1752Hibernate中发生"Session ... -
求园柱体的表面积和体积
2010-06-13 11:50 32711.先创建一个Point类,然后定义Trianglele类。在 ... -
写一个Point类,计算两个Point实例之间的距离;写一个判断点是否在圆内的方法。
2010-06-13 11:47 8016写一个Point类,计算 ... -
打印分页代码
2009-10-27 15:27 1251<!-- define some variables u ... -
非常好的打印预览代码
2009-10-27 15:24 1957<!DOCTYPE html PUBLIC &quo ... -
http上传文件深度解析-高性能http传输
2009-10-24 16:59 11377http上传文件深度解析-高性能http传输 2008-12 ... -
用java获得MAC地址
2009-10-14 15:55 2786package com.etong.bms; impor ... -
使用java2word向已经建好的表格里插入数据
2009-05-18 13:41 2775上一篇讲如何NEW一个已经填充好数据的表格出来,这篇我介绍 ... -
使用java2word向word文档里插入文本、表格、图片
2009-05-18 13:41 5940import java.util.ArrayList; ... -
JSP request对象属性列表
2009-05-15 15:05 3027<% out.println("Protoc ... -
IBM Portal与单点登录、集成企业级应用
2009-05-15 11:19 3493IBM Portal与单点登录、集 ... -
WAP 服务器设置
2009-04-11 15:53 1748WAP 服务器设置 二十一世纪是信息的世纪,以IP技 ... -
本地图片预览
2009-04-01 17:11 1196<?xml version="1.0" ... -
图片预装载技术
2009-04-01 17:08 1233<html> <body> < ... -
鼠标中键放大缩小图片
2009-04-01 17:03 1887<!DOCTYPE HTML PUBLIC " ...
相关推荐
在测试时,你可以创建一个`ldapTest`文件夹,其中包含模拟的测试数据或配置文件,以确保你的LDAP集成工作正常。例如,你可以创建一个`test.ldif`文件,用来导入测试用户数据,然后在测试类中使用`LdapTemplate`进行...
在文档“ldap组件配置案例.doc”中,主要讨论了如何在CAMS系统中集成LDAP组件,以实现与外部应用系统如邮件系统或Windows域的账号共享和统一认证。下面我们将详细探讨这一配置过程及其关键知识点。 1. **功能描述**...
- 集成LDAP到企业级应用,如Spring Security框架,实现统一的身份验证和授权。 - 使用LDAP作为服务发现的一部分,存储服务的元数据信息。 通过以上步骤,你可以构建一个基础的LDAP实例,用于身份验证和权限管理。...
10. **案例分析**:实际应用中,泛微可能被集成到如SAP、Oracle、Salesforce等大型企业应用中,实现如订单同步、客户信息共享等具体业务场景。 以上就是关于"泛微各种集成与及配置"的相关知识点,涵盖了集成的多个...
在IT行业中, Lightweight Directory Access Protocol (LDAP) 是一种用于存储和检索目录信息的标准协议,而Active Directory (AD) 是微软提供的目录服务,广泛应用于企业环境中进行用户身份验证和权限管理。...
jLDAP库集成了SSL支持,使得开发者能够创建安全的LDAP连接。 下面是一个简单的使用jLDAP进行SSL连接并查询LDAP目录的Java代码示例: ```java import com.novell.ldap.*; public class LDAPSSLExample { public ...
3. **目录服务集成**: 如果你的应用需要与 LDAP 目录服务进行交互,如读取员工信息、部门结构等,Spring-Ldap 能简化这一过程。 **三、示例中的项目结构** 在提供的压缩包中,`Spring-ldap.jar.zip` 可能包含了 ...
此外,还需要配置`LdapContextSource`以创建连接池,以及`LdapTemplate`实例以供应用程序使用。 5. Spring LDAP与Spring Framework集成: Spring LDAP很好地融入了Spring生态,可以与其他Spring模块(如Spring ...
这个war文件可以被部署到Servlet容器(如Tomcat)中,以运行并展示Acegi和LDAP集成的实例。 "server.xml"是Apache Tomcat或其他Servlet容器的配置文件,可能包含了关于如何配置和连接到LDAP服务器以及设置Acegi安全...
Fortinet的FortiGate设备支持集成LDAP服务,允许企业利用LDAP进行用户认证和权限管理,提升网络安全性和便捷性。通过配置LDAP,可以实现用户身份验证、授权和审计,进一步加强网络访问控制。 总结,LDAP作为一个...
【LDAP服务器介绍】 LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,它源自上世纪80年代的国际电报...学习和理解LDAP,对于IT管理员和开发者来说,是提升系统管理和集成能力的重要步骤。
在IT领域,特别是软件开发中,`Delphi`是一个强大的集成开发环境(IDE),它基于Object Pascal编程语言。`LDAP`(轻量级目录访问协议)则是一种用于访问和管理分布式目录服务的标准协议,常用于存储和检索用户、组织...
Spring LDAP提供了一套强大的工具和API,简化了在Spring应用中集成LDAP的过程。通过使用`LdapTemplate`和`AttributesMapper`等组件,开发人员可以高效地与LDAP服务器交互,执行复杂的数据操作。掌握这些概念和技巧...
这个扩展适用于那些既有内部数据库用户,又需要与LDAP/AD服务器集成的Laravel应用,例如企业内部的员工管理系统、多租户平台等。通过这样的扩展,开发者可以轻松地将现有应用与外部身份验证系统整合,同时保持...
它构建在Spring框架之上,提供了一种声明式的方式来处理 LDAP 查询,使得开发者能够更容易地集成LDAP服务到他们的应用中。 **安装与配置** 在开始使用Spring LDAP之前,你需要在项目中添加相关的依赖。如果你使用...
5. LDAP 集成与应用:探讨如何将 LDAP 与其他系统(如Samba、Active Directory、OpenSSH等)集成,以及如何为各种业务场景设计和实现认证和授权方案。 6. LDAP 性能优化与故障排除:分享如何监控和调整 LDAP 服务...
3. **应用集成**:在多个应用程序之间共享信息的情况下,使用LDAP可以简化集成过程并提高效率。 4. **数据分发**:LDAP支持数据的分布存储和复制,这对于大型组织来说非常有用。 #### 五、LDAP与其他数据库的对比 ...
在这个项目中,我们将会探讨如何利用SpringBoot框架集成ldap,以及如何进行数据同步。 首先,我们需要了解SpringBoot对LDAP的支持。Spring LDAP是Spring Framework的一部分,它提供了一个高层次的抽象层,使得...
在 AD 环境中,WebLogic 通常作为受管服务器运行,通过 LDAP 连接到 AD 实例进行用户身份验证。集成过程可能涉及以下部分: - **配置域安全策略**: 在 AD 域控制器上,为 WebLogic 服务器创建服务账户,并给予相应...