JAVA 通过LDAP获取AD域用户及组织信息

因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享。

前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的AD域组织和用户信息,实现域认证和单点登录。

LDAP: LDAP是轻量目录访问协议

AD域:微软基于域模式的集中化管理

1.常规的AD域登陆验证

LdapContext dc = null;
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://ld.123.com:389");//AD域路径和端口号
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, username);
            env.put(Context.SECURITY_CREDENTIALS, password);
            env.put(Context.REFERRAL, "throw");
            env.put("java.naming.ldap.attributes.binary", "objectGUID");// objectGUID也可以指定为其它属性
            
            try {
                DirContext ctx = new InitialDirContext(env);
                System.out.println("认证成功");
                ctx.close();
            } catch (Exception e) {
                System.out.println("认证失败");
            }

2.获取AD域用户组织及属性信息

获取AD域连接:

private static void entryActiveDirectory() throws NamingException {

LdapContext dc = null;

Hashtable<String, String> env = new Hashtable<String, String>();

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

env.put(Context.PROVIDER_URL, "ldap://ld.123.com:389");

env.put(Context.SECURITY_AUTHENTICATION, "simple");

env.put(Context.SECURITY_PRINCIPAL, " ld\\admin");

env.put(Context.SECURITY_CREDENTIALS, passwprd);

env.put(Context.REFERRAL, "throw");

dc = new InitialLdapContext(env, null);

String dn="OU=集团总部,OU=Greenland,DC=ld,DC=Greenland,DC=com";

processOrganize(dc,dn);

}

数据处理

//要获取的对象属性

private static String[] attributeNames = { "memberOf", "name", "userPrincipalName", "objectClass", "objectGUID","sAMAccountName","description" };

NamingEnumeration<?> contentsEnum = dc.list(dn);

while (contentsEnum.hasMore()) {

NameClassPair ncp = (NameClassPair) contentsEnum.next();

String ncpName = ncp.getName();

// 对特殊字符的DN跳过

if ((ncpName + "," + dn).indexOf("\"") != -1 || (ncpName + "," + dn).indexOf("/") != -1) {continue;}

Attributes atts = dc.getAttributes(ncpName + "," + dn, attributeNames);

//获取对象属性

Attribute objectClassAuttribute = atts.get("objectClass");

if (objectClassAuttribute.toString().indexOf("user") != -1) {//获取用户是user,部门组织是organizationalUnit

System.out.println(atts+ncpName + "," + dn); }

}

3.GUID的处理方式

objectguid是AD域组织和用户的唯一标识,当用户或组织修改名字后也不会发生变化,但是其他属性通过上面的方式都可以获取到正常值,包括中文。

但是objectguid是个例外,正常情况下都会出现乱码,而且一般的转码方式都是无效的(本人已经尝试了许多种),通过网上多种方式搜寻的答案许多都不靠谱,

最后在国外的一个论坛上找到了这个方法,首先声明下,这个方法获取的guid和AD域中看到的还是不一样的,但是,也是可以保证唯一性的,而且修改名字后,

再次获取也不会发生变化,所以可用,以下的处理代码:

Object oo= atts.get("objectguid").get();

byte[] GUID = toByteArray(oo);

String strGUID = "";

strGUID = strGUID + AddLeadingZero((int)GUID[3] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[2] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[1] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[0] & 0xFF);

strGUID = strGUID + "-";

strGUID = strGUID + AddLeadingZero((int)GUID[5] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[4] & 0xFF);

strGUID = strGUID + "-";

strGUID = strGUID + AddLeadingZero((int)GUID[7] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[6] & 0xFF);

strGUID = strGUID + "-";

strGUID = strGUID + AddLeadingZero((int)GUID[8] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[9] & 0xFF);

strGUID = strGUID + "-";

strGUID = strGUID + AddLeadingZero((int)GUID[10] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[11] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[12] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[13] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[14] & 0xFF);

strGUID = strGUID + AddLeadingZero((int)GUID[15] & 0xFF);

System.out.println("GUID (String format): " + strGUID);

时间: 2024-10-12 11:52:31

JAVA 通过LDAP获取AD域用户及组织信息的相关文章

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类--资源(如印表机).服务(如电子邮件).和人物(即帐户或用户,以及组

java以及C#获取AD域上用户信息

JAVA /** *  JAVA 读取AD用户信息 *  aa00a00 */package com.wanda.sso.client.servlet; import java.util.Hashtable; import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.directory.Attribute;imp

AD 域服务简介(二)- Java 获取 AD 域用户

博客地址:http://www.moonxy.com 一.前言 先简单简单回顾上一篇博文中关于 AD 域和 LDAP目录访问协议的基本概念. AD(Active Directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,使用的协议为 LDAP,安装了AD 的服务器称为 DC 域控制器,存储整个域的对象的信息并周期性更新,其中的对象分为三大类:资源(如印表机).服务(如电子邮件).和用户(即帐户或用户,以及组). 通常大家都会将 LDAP 与关系数据库相比,认为 LDAP 是另

Java利用jcifs集成AD域用户认证

最近一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了现在网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全! 我们通过一个demo来看看jcifs实现SSO,SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一 个用户的登录的机制.它是目前比较流行的企业业务整合的解决方案之一. 第

JAVA使用Ldap操作AD域

项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员在电脑上操作查询的数据可能会存在差异(同一个意思的表示字段,两者可能不同). (2). 连接ad域有两个地址: ldap://XXXXX.com:389 和 ldap://XXXXX.com:636(SSL). (3). 端口389用于一般的连接,例如登录,查询等非密码操作,端口636安全性较高,用

AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作

博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 Java 获取 AD 域用户,请参阅:AD 域服务简介(二)- Java 获取 AD 域用户 一.前言 在日常的开发中,为了实现单点登录,需要对域用户进行增删改查操作,以维持最新的用户信息,确保系统的安全. 二.Java 对 AD 域用户的增删改查操作 package com.moonxy.ad; import java.uti

C#获取AD域中计算机和用户的信息

如果你的计算机加入了某个AD域,则可以获取该域中所有的计算机和用户的信息. 所用程序集,需要.Net Framework 4. 添加程序集引用 System.DirectoryServices.AccountManagement 获取AD域名称,未加入AD域的,只能获取计算机名称. 如果未加入任何域,则后续的获取域用户.计算机等操作将无法进行,实例化域上下文对象时,会抛出异常. 1 IPGlobalProperties ipGlobalProperties = IPGlobalPropertie

关于Ldap对AD域账户的增删改查

今天心情很不爽,那啥也不懂的老板,又来直接修改了我的需求,还很自信的对我们研发人员说:"他这产品经理已经做得很好了!",在这里我回复一句,以我这么多年的经验,做得跟一条狗似的,还自我感觉良好!!!好啦,不扯别的啦,来讲讲Ldap对AD域账户的操作吧!至于Ldap和ad今天就不做详细解释了,有兴趣的朋友可以看看上一篇博文,里面有详细的介绍!直接上代码: /** * @Description: * * @Title: LdapByUser.java * @Package com.joyce

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式): # apt-get install libnss-ldap   (中间直接回车,忽略) # vi /etc/nsswitch.conf passwd: files ldap group:  files ldap shadow: files ldap :wq # vi /etc/ldap.conf base dc=ming,dc=com uri ldap://10.0.0.2 binddn cn=ldapadmin,cn=