因为工作需求近期做过一个从客户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);

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

  1. Java使用LdAP获取AD域用户

    随着我们的习大大上台后,国家在网络信息安全方面就有了非常明显的改变!所以如今好多做网络信息安全产品的公司和须要网络信息安全的公司都会提到用AD域server来验证,这里就简单的研究了一下! 先简单的讲 ...

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

    博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 一.前言 先简单简单回顾上一篇 ...

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

    近期一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了如今网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全! 我 ...

  4. JAVA使用Ldap操作AD域

    项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...

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

    博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 Java 获取 AD 域用户, ...

  6. gitlab用户登录与AD域用户集成

    ---恢复内容开始--- 编辑gitlab.rb文件 sudo vi /etc/gitlab/gitlab.rb 下图是我编辑的内容示例(仅供参考): 编辑以下内容: gitlab_rails['ld ...

  7. java修改AD域用户密码使用SSL连接方式

    正常情况下,JAVA修改AD域用户属性,只能修改一些普通属性, 如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改, SSL连接的方式需要操作以下步骤: 1 ...

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

    如果你的计算机加入了某个AD域,则可以获取该域中所有的计算机和用户的信息. 所用程序集,需要.Net Framework 4. 添加程序集引用 System.DirectoryServices.Acc ...

  9. Ldap实现AD域认证

    1.java Ldap基础类 package com.common; import java.io.FileInputStream; import java.io.IOException; impor ...

随机推荐

  1. outscan 一键批量 get struct2 devMode (CNVD-2016-04656)

    之前写的一个玩意 下载地址:http://pan.baidu.com/s/1i5jmEwP 密码:v8v3 一键批量 get struct2 devMode 支持百度.google(google有访问 ...

  2. MySQL学习总结

    MySQL的学习总结,根据数据库的四大基本操作——”增删查改“分类整理.

  3. Android proguard 详解

    本文转载于:http://blog.csdn.net/banketree/article/details/41928175 简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往 ...

  4. setTimeout的使用与参数传递

        在使用JavaScript的时候,我们有时需要间隔的执行一个方法,比如用来产生网页UI动画特效啥的.这是我们常常会使用方法setInterval或setTimeout,但是由于这两个方法是由脚 ...

  5. visual studio code

    偏好设置: "editor.fontSize": 26, "editor.tabSize": 8, "editor.mouseWheelZoom&qu ...

  6. Python核心编程练习题笔记: type(a)==type(b) 和 type(a) is type(b)的差别

    前式需要找到类型的ID(相当于门牌号),然后“敲门”取得类型值 后式只需要找到类型的ID,而不需要再去“敲门”获得类型具体值.在一个“门牌号”内只可能有一个值,因此就不用明知故问了.因此后式比前式少了 ...

  7. switch

    关于java中switch使用的一些说明 switch(表达式) { case常量表达式1:语句1; .... case常量表达式2:语句2; default:语句; } default就是如果没有符 ...

  8. [zz]简单有效,在家就能锻炼!

    简单有效,在家就能锻炼!下面这套动作美腿.美臀.瘦腰,一步到位,是全身塑形的必备,不用多练,每组1分钟.只需一把椅子即可,献给没有时间.条件去健身房的健身爱好者们! http://weibo.com/ ...

  9. json在项目中的应用大总结

    一.摘要 刚开始接触json的时候,那时候还不太清楚json到底是个什么东西,然后就在项目中使用了它.因为没有搞明白json的本质,所以刚开始使用json的时候走了不少弯路.这次总结一些json的知识 ...

  10. UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理

    一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...