java 如何获取当前AD域用户名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 如何获取当前AD域用户名?相关的知识,希望对你有一定的参考价值。

参考技术A Java直接读AD很麻烦
后来通过.net读取,发布成webservice给java访问,简单很多追问

你好 谢谢你的解答 我们这不用.net,因为我们的OA系统要跟AD域同步,然后AD域登录后直接就能访问OA,而不需要二次登录,我只想知道java如何判断当前登录的用户是否是AD域用户,是的话就直接登录系统,不在输入用户名密码。

追答

问题点分析:
情况一:已知道当前登录用户的用户名ID, 需要解决的问题是 验证该用户是否是AD域用户?
如果已经知道当前的用户ID,通过java的Jndi 操作 LDAP (AD)即可,查询验证

情况二:尚不知道当前登录用户的用户名ID, 需要解决的问题是获取域账号,并验证该用户名ID是否在域中?
在你的登录首页java入获取域用户的windows脚本信息(记得VB有,其他的可以网上搜索一下),然后做登录判断(同样是用JNDI检索LDAP或AD)

本回答被提问者采纳

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

博客地址:http://www.moonxy.com

关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用

一、前言

先简单简单回顾上一篇博文中关于 AD 域和 LDAP目录访问协议的基本概念。

AD(Active Directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,使用的协议为 LDAP,安装了AD 的服务器称为 DC 域控制器,存储整个域的对象的信息并周期性更新,其中的对象分为三大类:资源(如印表机)、服务(如电子邮件)、和用户(即帐户或用户,以及组)。

通常大家都会将 LDAP 与关系数据库相比,认为 LDAP 是另一种的存贮方式,然后在读性能上进行比较。实际上,这种对比的基础是不正确的。LDAP 和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网络数据库,对象数据库),前者是存贮模式和访问协议。LDAP 是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言 SQL 属同一级别。LDAP 最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。

二、Java 获取 AD 域用户

Java 获取 AD 域用户通常用于单点登录(Single Sign On,SSO)。

package com.moonxy.ad;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

/**
 * @Description:获取AD域用户
 * @author moonxy
 * @date 2018-05-14
 */
public class ADUtils {
    public static void main(String[] args) {
        Properties env = new Properties();
        //使用UPN格式:User@domain或SamAccountName格式:domain\\\\User
        String adminName = "administrator@moonxy.com";
        String adminPassword = "smartdot&2014";//password
        String ldapURL = "LDAP://192.168.1.103:389";//ip:port

        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别:"none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);// AD User
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);// AD Password 
        env.put(Context.PROVIDER_URL, ldapURL);// LDAP工厂类
        
        try {
            LdapContext ctx = new InitialLdapContext(env, null);
            //搜索控制器
            SearchControls searchCtls = new SearchControls();
            //创建搜索控制器 
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            //LDAP搜索过滤器类,此处只获取AD域用户,所以条件为用户user或者person均可
            //(&(objectCategory=person)(objectClass=user)(name=*))
            String searchFilter = "objectClass=user";
            //AD域节点结构
            String searchBase = "OU=Java开发组,OU=软件研发部,DC=moonxy,DC=com";
            
            String returnedAtts[] = { "url", "employeeID",  "mail",
                    "name", "userPrincipalName", "physicalDeliveryOfficeName",  
                    "departmentNumber", "telephoneNumber", "homePhone",  
                    "mobile", "department", "sAMAccountName", "whenChanged"}; // 定制返回属性
            searchCtls.setReturningAttributes(returnedAtts);
            NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls);
            
            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult) answer.next();
                System.out.println("<<<::[" + sr.getName()+"]::>>>>");//返回格式一般是CN=xxxx,OU=xxxx
                Attributes Attrs = sr.getAttributes();//得到符合条件的属性集  
                if (Attrs != null) {
                    for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                        Attribute Attr = (Attribute) ne.next();//得到下一个属性
                        System.out.print(Attr.getID().toString() + ":");
                        //读取属性值
                        for (NamingEnumeration e = Attr.getAll(); e.hasMore();) {
                            String userInfo =  e.next().toString();
                            System.out.print(userInfo);
                        }
                        System.out.println("");
                    }
                }
            }
            ctx.close();
        }catch (NamingException e) {
            e.printStackTrace();
            System.err.println("Problem searching directory: " + e);
        }
    }
}

输出的结果如下:

 

以上是关于java 如何获取当前AD域用户名?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何获取本机电脑的AD域名称

如何从Azure获取当前的WindowsIdentity

如何获取当前用户的windows身份?

java如何获得客户端域用户名和域用户所在的域的名称

如何在 Windows 窗体应用程序中获取 *** 用户的当前用户身份?