1、获取windows AD域用户信息,首先需要有一个ad域管理员权限的账号,用这个账号连接ad域,获取所有域用户信息

用LdapContext,它继承自DirContext

  1. public Object getAllAdUserNames() {
  2. List<String> list = new ArrayList<>();
  3. String username = "lisi@ad.com";
  4. String password = "123@abc.com";
  5.  
  6. String url = "ldap://192.168.44.40:389"; //使用ldap协议连接windows ad域,缺省端口是389
  7. Hashtable env = new Hashtable();
  8.  
  9. env.put(Context.SECURITY_AUTHENTICATION, "simple");//"none","simple","strong"
  10. env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  11. env.put(Context.PROVIDER_URL, url);
  12. env.put(Context.SECURITY_PRINCIPAL, username);
  13. env.put(Context.SECURITY_CREDENTIALS, password);
  14. NamingEnumeration results = null;
  15. try {
  16. LdapContext ctx = new InitialLdapContext(env,null);
  17. SearchControls searchControls = new SearchControls();
  18. searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  19.  
  20. String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
  21. String searchBase = "DC=ad,DC=com";
  22. // String returnedAtts[] = {"memberOf"};
  23.  
  24. //获取登录名,samaccountname是兼容windows2000以前系统的(如:lisi),userprincipalname是带域名的登录名(如:lisi@ad.com)
           String returnedAtts[] = {"samaccountname", "userprincipalname"};
  25. searchControls.setReturningAttributes(returnedAtts);
  26.  
  27. NamingEnumeration<SearchResult> result = ctx.search(searchBase,searchFilter,searchControls);
  28. while (result.hasMoreElements()) {
  29. SearchResult searchResult = (SearchResult) result.next();
  30. list.add(searchResult.getName());
  31. System.out.println("[" + searchResult.getName() + "]");
  32. }
  33. ctx.close();
  34. } catch (AuthenticationException e) {
  35. e.printStackTrace();
  36. return e.toString();
  37. } catch (NameNotFoundException e) {
  38. e.printStackTrace();
  39. return e.toString();
  40. } catch (NamingException e) {
  41. e.printStackTrace();
  42. return e.toString();
  43. } finally {
  44. if (results != null) {
  45. try {
  46. results.close();
  47. } catch (Exception e) {
  48. }
  49. }
  50. }
  51. return list;
  52. }

2、用DirContext,与上边略有区别

  1. public List<String> getAllPersonNames() {
  2. String username = "lisi@ad.com";
  3. String password = "123@abc.com";
  4.  
  5. Hashtable env = new Hashtable();
  6. env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  7. env.put(Context.PROVIDER_URL, "ldap://192.168.44.40:389/dc=ad,dc=com");
  8. env.put(Context.SECURITY_PRINCIPAL, username);
  9. env.put(Context.SECURITY_CREDENTIALS, password);
  10.  
  11. DirContext ctx;
  12. try {
  13. ctx = new InitialDirContext(env);
  14. } catch (NamingException e) {
  15. throw new RuntimeException(e);
  16. }
  17.  
  18. List<String> list = new ArrayList<>();
  19. NamingEnumeration<SearchResult> results = null;
  20. try {
  21. SearchControls controls = new SearchControls();
  22. controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  23. String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
  24. results = ctx.search("", searchFilter, controls);
  25.  
  26. while (results.hasMoreElements()) {
  27. SearchResult searchResult = results.next();
  28. Attributes attributes = searchResult.getAttributes();
  29. Attribute attr = attributes.get("cn");
  30. String cn = attr.get().toString();
  31. list.add(cn);
  32. }
  33. } catch (NameNotFoundException e) {
  34. e.printStackTrace();
  35. } catch (NamingException e) {
  36. e.printStackTrace();
  37. } finally {
  38. if (results != null) {
  39. try {
  40. results.close();
  41. } catch (Exception e) {
  42. // Never mind this.
  43. }
  44. }
  45. if (ctx != null) {
  46. try {
  47. ctx.close();
  48. } catch (Exception e) {
  49. // Never mind this.
  50. }
  51. }
  52. }
  53. return list;
  54. }

3、用Spring集成ldap

  1. 依赖
  2.  
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-data-ldap</artifactId>
  6. </dependency>

application.yml的配置,一种方式自定义ldap,一种是直接采用spring data集成

3.1自定义,重载LdapTemplate

application.yml

  1. #自定义的ldap config
  2. ldap:
  3. base: OU=开发部,DC=ad,DC=com
  4. url: "ldap://192.168.44.40:389"
  5. username: xu.dm@ad.com
  6. password: "123@abc.com"
  7. referral: follow
  1. LdapConfigreferral参数具体含义不明确,可以注销了
  1. @Configuration
  2. public class LdapConfig {
  3.  
  4. @Value("${ldap.url}")
  5. private String ldapUrl;
  6.  
  7. @Value("${ldap.base}")
  8. private String ldapBase;
  9.  
  10. @Value("${ldap.username}")
  11. private String ldapUserDn;
  12.  
  13. @Value("${ldap.password}")
  14. private String ldapUserPwd;
  15.  
  16. @Value("${ldap.referral}")
  17. private String ldapReferral;
  18.  
  19. @Bean
  20. public LdapTemplate ldapTemplate() {
  21. return new LdapTemplate(contextSourceTarget());
  22. }
  23.  
  24. @Bean
  25. public LdapContextSource contextSourceTarget() {
  26. LdapContextSource ldapContextSource = new LdapContextSource();
  27.  
  28. ldapContextSource.setUrl(ldapUrl);
  29. ldapContextSource.setBase(ldapBase);
  30. ldapContextSource.setUserDn(ldapUserDn);
  31. ldapContextSource.setPassword(ldapUserPwd);
  32. // ldapContextSource.setReferral(ldapReferral);
  33. ldapContextSource.setPooled(false);
  34. ldapContextSource.afterPropertiesSet();
  35. return ldapContextSource;
  36. }
  37. }
  1. @Service
  2. public class LdapServiceImpl implements LdapService {
  3.  
  4. @Resource
  5. LdapTemplate ldapTemplate;
  6.  
  7. @Override
  8. public Iterable<User> getUserList(String cn) {
  9. LdapQuery query = LdapQueryBuilder.query().attributes("cn").where("objectclass")
  10. .is("user").and("cn").is(cn);
  11. return ldapTemplate.find(query,User.class);
  12. }
  13.  
  14. @Override
  15. public User create(User user) {
  16. ldapTemplate.create(user);
  17. return user;
  18. }
  19.  
  20. @Override
  21. public void delete(User user) {
  22. ldapTemplate.delete(user);
  23. }
  24.  
  25. }
  26.  
  27. @Override
  28. public Iterable<User> findAll() {
  29. return ldapTemplate.findAll(User.class);
  30. }
  31. }

实体:

  1. @Entry(base = "dc=ad,dc=com", objectClasses = {"top","person"})
  2. public class User implements Serializable {
  3.  
  4. @Id
  5. @JsonIgnore
  6. private Name dn;
  7.  
  8. // @DnAttribute(value = "distiguishedName")
  9. // private String distinguishedName;
  10.  
  11. @Attribute(name = "cn")
  12. // @DnAttribute(value="cn", index=1)
  13. private String commonName;
  14.  
  15. @Attribute(name = "sn")
  16. private String suerName;
  17.  
  18. @Attribute(name="userPassword")
  19. private String userPassword;
  20.  
  21. // @DnAttribute(value="ou", index=0)
  22. @Attribute(name="ou")
  23. private String organizaitonUnit;
  24.  
  25. @Attribute(name="displayName")
  26. private String displayName;
  27.  
  28. public User() {
  29. }
  30.  
  31. public User(String commonName, String organizaitonUnit) {
  32. Name dn = LdapNameBuilder.newInstance()
  33. .add("ou",organizaitonUnit)
  34. .add("cn",commonName)
  35. .build();
  36. this.dn = dn;
  37. this.commonName = commonName;
  38. this.organizaitonUnit = organizaitonUnit;
  39. }
  40.  
  41. 。。。 。。。略
  42. }

3.2 Spring data集成方式

application.yml

  1. #spring data方式
  2. spring:
  3. ldap:
  4. base: OU=开发部,DC=ad,DC=com
  5. urls: "ldap://192.168.44.40:389"
  6. username: xu.dm@ad.com
  7. password: "123@abc.com"
  1. public interface UserRepository extends LdapRepository<User> {
  2. }
  1. @Service
  2. public class LdapServiceImpl implements LdapService {
  3.  
  4. @Resource
  5. UserRepository userRepository;
  6.  
  7. @Override
  8. public User findOne(String cn) {
  9. LdapQuery query = LdapQueryBuilder.query().attributes("cn").where("objectclass")
  10. .is("person").and("cn").is(cn);
  11. return userRepository.findOne(query).orElse(null);
  12. }
  13.  
  14. }

获取和验证Windows AD域的用户信息的更多相关文章

  1. Windows AD域升级方

    前面的博客中我谈到了网络的基本概念和网络参考模型,今天我们来谈企业中常用的技术,Windows AD 域,今天我的笔记将重点讲解Windows AD 域的升级和迁移方法,通过3个小实验进行配置,真实环 ...

  2. Windows AD域管理软件是什么?

    Windows AD域管理软件是什么? ADManager Plus是一个简单易用的Windows AD域管理工具,帮助域管理员简化日常的管理工作.通过直观友好的操作界面,可以执行复杂的管理操作,比如 ...

  3. jsonp跨域实现单点登录,跨域传递用户信息以及保存cookie注意事项

    网站A:代码:网站a的login.html页面刷新,使用jsonp方式将信息传递给b.com的login.php中去,只需要在b.com中设置一下跨域以及接收参数,然后存到cookei即可, 注意:网 ...

  4. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

  5. ASP.NET站点Windows身份验证集成AD域,非LDAP

    站点集成AD域验证 服务器机器入域 计算机右键属性-->“更改设置”-->“更改”-->填写所属域,确认后重启机器生效. 部署测试站点,localhost.ip.域名三种方式登录效果 ...

  6. windows AD域安装及必要设置

    一.安装AD域 运行dcpromo命令,安装AD域. 步骤: 1.win+R 2.dcpromo 图例: 百度百科关于“dcpromo”解释: dcpromo命令是一个“开关”命令.如果Windows ...

  7. AD域 根据 用户属性userAccountControl 来判断用户禁用属性

    参考:https://support.microsoft.com/zh-cn/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipu ...

  8. 将AD域漫游用户配置文件放在samba服务器中

    书接上回https://www.cnblogs.com/jackadam/p/11448497.html 我们已经将linux服务器设置为域成员,启动samba服务后,已经实现了使用域账号验证,自动创 ...

  9. AD域创建用户无法登录

    怎么登录都无法登录 解决办法: 创建用户的时候   将用户下次登录时须更改密码的勾去掉    不然需要修改密码才可以登录

随机推荐

  1. TeamViewer卡在正在初始化显示参数

    在windows的mstsc远程桌面中打开teamviewer,远程桌面开着的时候可以连接teamviewer,但是当我断开mstsc之后,再用teamviewer连就连接不上了,一直都是正在初始化显 ...

  2. 牛客小白月赛9 A签到(分数取模,逆元)

    传送门 对分母求一下逆元,把除法取模变成乘法取模,逆元介绍看这里 这种方法只适合模为质数的情况 #include<bits/stdc++.h> using namespace std; ; ...

  3. 解析build.gradle文件

    Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言DSL来声明项目设置,摒弃了传统XML(如Ant和Maven)的各种繁琐配置 项目结构如上图: 1.最外层目录下的b ...

  4. jmeter逻辑控制器

    刚开始学习,只写几种了解的逻辑控制器 1.简单控制器 只用来组合采样器和其他逻辑控制器,不影响jmeter的运行 2.循环控制器 用来循环执行采样器和其他逻辑控制器,例如一个用户发送特定请求多次,即可 ...

  5. 使用MyBatis遇到的一些需要记录下的问题

    (1)MyBaits结果集返回Map,Map集合乱序. xml 中的SQL 输出: 改成: 输出: 目测跟字母顺序有关:ABCDEFGHIJKLMNOPQRSTUVWXYZ (2)需要对字段动态排序 ...

  6. Linux系统进程管理

    Linux系统进程管理 什么是进程 进程是已启动的可执行程序的运行实例,进程有以下组成部分: 分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程 ...

  7. 20172305 暑假作业 之 TimeCalculate & Save Iron Man

    20172305 暑假作业 之 TimeCalculate & Save Iron Man TimeCalculate 项目介绍 项目名称: TimeCalculate 项目简介: 本项目基于 ...

  8. 每日Scrum--No.2

    Yesterday:找地图 Today: 找到最适合我们软件的地图版本 Problem:找不到特别匹配的版本

  9. 使用C和C++实现“电梯”的区别

    C 面向过程:       该电梯不允许未卜先知,故程序需逐条处理乘客请求并更新当前各变量状态.       如何获得最短时间:是否立即响应请求,计算出不同决策下的总时间,并进行比较,然后选择最短时间 ...

  10. 【树上DFS】Tree and Polynomials

    http://codeforces.com/gym/101372 D push1[i][k]:所有操作1总共要让节点i下推多少系数k push2[i][k]:所有操作2总共要让节点i上推多少系数k s ...