文档章节

java调用AD域验证用户,搜索用户信息

丶Lion
 丶Lion
发布于 2016/09/08 12:01
字数 935
阅读 118
收藏 0

如下是代码

package com.pansoft.oa.untils;

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.AuthenticationException;
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.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class ADUtils {

	/**
	 * 使用AD域校验用户密码
	 * */
    public static Boolean validateUserByAD(String username , String password){
    	Boolean result = false;
    	DirContext ctx=null;
        Hashtable<String,String> HashEnv = new Hashtable<String,String>();
        HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别(none,simple,strong)
        HashEnv.put(Context.SECURITY_PRINCIPAL, "sinopec\\"+username); //AD的用户名
        HashEnv.put(Context.SECURITY_CREDENTIALS, password); //AD的密码
        HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
        HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");//连接超时设置为3秒
        HashEnv.put(Context.PROVIDER_URL, "LDAP://10.116.20.12");// 默认端口389
        try {
            ctx = new InitialDirContext(HashEnv);// 初始化上下文
            System.out.println("身份验证成功!");
        } catch (AuthenticationException e) {
            System.out.println("身份验证失败!");
            e.printStackTrace();
        } catch (javax.naming.CommunicationException e) {
            System.out.println("AD域连接失败!");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("身份验证未知异常!");
            e.printStackTrace();
        } finally{
            if(null!=ctx){
                try {
                    ctx.close();
                    ctx=null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    	return result;
    }
    
    /**
     * 获取域下所有用户
     * */
    public void getAllUserFromAD(){
    	
    }
    
    
    public void GetADInfo() {  
    	  String userName = "xxxx"; // 用户名称  
    	  String passwd = "xxx";  
    	  String host = "192.168.100.14"; // AD服务器  
    	  String port = "389"; // 端口  
    	  String domain = "@xxx.com"; // 邮箱的后缀名  
    	  String url = new String("ldap://" + host + ":" + port);  
    	  String user = userName.indexOf(domain) > 0 ? userName : userName  
    	    + domain;  
    	  Hashtable HashEnv = new Hashtable();  
    	  // String adminName ="CN=oyxiaoyuanxy,CN=Users,DC=Hebmc,DC=com";//AD的用户名  
    	  String adminName = "xueqiang"; // 注意用户名的写法:domain\User 或  User@domain.com  
    	  String adminPassword = "123456"; // 密码  
    	  HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别  
    	  HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User  
    	  HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD Password  
    	  HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,  
    	    "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类  
    	  HashEnv.put(Context.PROVIDER_URL, url);  
    	  try {  
    	   LdapContext ctx = new InitialLdapContext(HashEnv, null);  
    	   // 域节点  
    	   String searchBase = "DC=wanda-dev,DC=cn";  
    	   // LDAP搜索过滤器类  
    	   String searchFilter = "objectClass=User";  
    	   // 搜索控制器  
    	   SearchControls searchCtls = new SearchControls(); // Create the  
    	   // search  
    	   // controls  
    	   // 创建搜索控制器  
    	   searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Specify  
    	   // the  
    	   // search  
    	   // scope  
    	   // 设置搜索范围  
    	   // searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE); //  
    	   // Specify the search scope 设置搜索范围  
    	   String returnedAtts[] = { "memberOf", "distinguishedName",  
    	     "Pwd-Last-Set", "User-Password", "cn" };// 定制返回属性  
    	   // String returnedAtts[] = { "url", "whenChanged", "employeeID",  
    	   // "name", "userPrincipalName", "physicalDeliveryOfficeName",  
    	   // "departmentNumber", "telephoneNumber", "homePhone",  
    	   // "mobile", "department", "sAMAccountName", "whenChanged",  
    	   // "mail" }; // 定制返回属性  
    	   searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集  
    	   // 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果  
    	   NamingEnumeration answer = ctx.search(searchBase, searchFilter,  
    	     searchCtls);// Search for objects using the filter  
    	   // 初始化搜索结果数为0  
    	   int totalResults = 0;// Specify the attributes to return  
    	   int rows = 0;  
    	   while (answer.hasMoreElements()) {// 遍历结果集  
    	    SearchResult sr = (SearchResult) answer.next();// 得到符合搜索条件的DN  
    	    System.out.println(++rows  
    	      + "************************************************");  
    	    System.out.println(sr.getName());  
    	    Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集  
    	    if (Attrs != null) {  
    	     try {  
    	      for (NamingEnumeration ne = Attrs.getAll(); ne  
    	        .hasMore();) {  
    	       Attribute Attr = (Attribute) ne.next();// 得到下一个属性  
    	       System.out.println(" AttributeID=属性名:"  
    	         + Attr.getID().toString());  
    	       // 读取属性值  
    	       for (NamingEnumeration e = Attr.getAll(); e  
    	         .hasMore(); totalResults++) {  
    	        System.out.println("    AttributeValues=属性值:"  
    	          + e.next().toString());  
    	       }  
    	       System.out.println("    ---------------");  
    	       // 读取属性值  
    	       // Enumeration values = Attr.getAll();  
    	       // if (values != null) { // 迭代  
    	       // while (values.hasMoreElements()) {  
    	       // System.out.println("    AttributeValues=属性值:"+  
    	       // values.nextElement());  
    	       // }  
    	       // }  
    	       // System.out.println("    ---------------");  
    	      }  
    	     } catch (NamingException e) {  
    	      System.err.println("Throw Exception : " + e);  
    	     }  
    	    }  
    	   }  
    	   System.out  
    	     .println("************************************************");  
    	   System.out.println("Number: " + totalResults);  
    	   ctx.close();  
    	  } catch (NamingException e) {  
    	   e.printStackTrace();  
    	   System.err.println("Throw Exception : " + e);  
    	  }  
    	 }  
    	/* public static void main(String args[]) {  
    	  // 实例化  
    	  ADOperTest ad = new ADOperTest();  
    	  ad.GetADInfo();  
    	 }*/  
    	   
    	 public static void main(String args[]) {  
    	        Hashtable HashEnv = new Hashtable();  
    	  
    	        String LDAP_URL = "ldap://xxx.com:389"; //LDAP访问地址  
    	        String adminName = "xxx@xxx.com"; //注意用户名的写法:domain\User 或 User@domain.com  
    	        String adminPassword = "xxxx"; //密码  
    	  
    	        HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); //LDAP访问安全级别  
    	        HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); //AD User  
    	        HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); //AD Password  
    	        HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); //LDAP工厂类  
    	        HashEnv.put(Context.PROVIDER_URL, LDAP_URL);  
    	  
    	        try {  
    	          LdapContext ctx = new InitialLdapContext(HashEnv, null);  
    	          SearchControls searchCtls = new SearchControls(); //Create the search controls  
    	          searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); //Specify the search scope  
    	  
    	          String searchFilter = "objectClass=User"; //specify the LDAP search filter  
    	          
    	          String searchBase = "DC=xxx,DC=com"; //Specify the Base for the search//搜索域节点  
    	          int totalResults = 0;  
    	  
    	               String returnedAtts[] = {  
    	              "url", "whenChanged", "employeeID", "name", "userPrincipalName",  
    	              "physicalDeliveryOfficeName", "departmentNumber", "telephoneNumber",  
    	              "homePhone", "mobile", "department", "sAMAccountName", "whenChanged",  
    	              "mail"}; //定制返回属性  
    	  
    	          searchCtls.setReturningAttributes(returnedAtts); //设置返回属性集  
    	  
    	          //Search for objects using the filter  
    	          NamingEnumeration answer = ctx.search(searchBase, searchFilter,searchCtls);  
    	            
    	          if(answer==null||answer.equals(null)){  
    	              System.out.println("answer is null");  
    	          }else{  
    	              System.out.println("answer not null");  
    	          }  
    	            
    	          System.out.println(answer.hasMoreElements());  
    	            
    	          while (answer.hasMoreElements()) {  
    	            SearchResult sr = (SearchResult) answer.next();  
    	            System.out.println("************************************************");  
    	            System.out.println(sr.getName());  
    	  
    	            Attributes Attrs = sr.getAttributes();  
    	            if (Attrs != null) {  
    	              try {  
    	                for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore(); ) {  
    	                  Attribute Attr = (Attribute) ne.next();  
    	  
    	                  System.out.println(" AttributeID=" + Attr.getID().toString());  
    	  
    	                  //读取属性值  
    	                  for (NamingEnumeration e = Attr.getAll(); e.hasMore();totalResults++) {  
    	                    System.out.println("    AttributeValues=" + e.next().toString());  
    	                  }  
    	                  System.out.println("    ---------------");  
    	  
    	                  //读取属性值  
    	                  Enumeration values = Attr.getAll();  
    	                  if (values != null) { // 迭代  
    	                    while (values.hasMoreElements()) {  
    	                      System.out.println("    AttributeValues=" + values.nextElement());  
    	                    }  
    	                  }  
    	                  System.out.println("    ---------------");  
    	                }  
    	              }  
    	              catch (NamingException e) {  
    	                System.err.println("Throw Exception : " + e);  
    	              }  
    	            }  
    	          }  
    	          System.out.println("Number: " + totalResults);  
    	          ctx.close();  
    	        }  
    	  
    	        catch (NamingException e) {  
    	          e.printStackTrace();  
    	          System.err.println("Throw Exception : " + e);  
    	        }  
    	    }  
}

主要是这个validateUserByAD方法

其他的并没有验证

 

© 著作权归作者所有

丶Lion

丶Lion

粉丝 57
博文 42
码字总数 29826
作品 1
济南
后端工程师
私信 提问
用java进行LDAP用户登陆(用户认证)及修改密码

一、用户认证 public String execute(){Hashtable env = new Hashtable();String LDAP_URL = "ldap://8.8.8.8:389"; // LDAP访问地址env.put(Context.INITIALCONTEXTFACTORY,"com.sun.jndi.l......

hello_bear
2015/08/19
0
0
java B2B2C 多级分销多租户电子商城系统-单点登录(SSO)简介

单点登录SSO(Single Sign-On)是身份管理中的一部分。 SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即 通过一个应用中的安全验证...

it菲菲
04/12
0
0
【Ovirt 笔记】engine 用户扩展管理分析与整理

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
2018/06/13
0
0
使用 Apache Shiro 为 web 应用程序进行用户身份验证

简介: Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权。在本文中,了解 Apache Shiro 并通过示例来在一个 Groovy web 应用程序中尝试使用 Shiro 进行身份验证和授权。 Apache...

IBMdW
2011/08/22
2.3K
0
通过 HttpAuthenticationMechanism 执行 Web 身份验证

通过 Java EE 8 中新的注解驱动的 HTTP 身份验证机制执行经典和自定义的 Servlet 身份验证 系列内容: 此内容是该系列 4 部分中的第 # 部分: Java EE 8 Security API 入门,第 2 部分 http...

Alex Theedom
2018/04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker中部署的应用,获取含有中文字符的验证码图片时无法正常显示

使用docker过程中遇过的最诡异的问题,服务在本地环境中,通过在IDEA里面运行,或者使用java -jar ***.war运行,获取验证码图片都没有问题,但是运行在docker中,图片正常返回,但是上面的汉...

莫在全
4分钟前
0
0
postgres+socket.io+nodejs实时地图应用实践

nodejs一直以异步io著称,其语言特性尤其擅长于在realtime应用中,如聊天室等。在进行实时应用开发时,必不可少的需要用到 socket.io库,可以说,nodejs+socket.io在实时应用中具有较好的表现...

dragon_tech
10分钟前
1
0
Java开发面试题汇总

目前流行的开发技术、常见的面试问题以及问题的答案都已经写的特别清楚了,今天我在之前的基础上,再基于个人的经验继续精选一些面试题给大家阅读参考。 1,Java的反射 Java 反射机制是在运行...

花漾年华
15分钟前
0
0
聊聊flink jdbc的ParameterValuesProvider

序 本文主要研究一下flink jdbc的ParameterValuesProvider ParameterValuesProvider flink-jdbc_2.11-1.8.0-sources.jar!/org/apache/flink/api/java/io/jdbc/split/ParameterValuesProvide......

go4it
15分钟前
0
0
UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部