获取和验证Windows AD域的用户信息
1、获取windows AD域用户信息,首先需要有一个ad域管理员权限的账号,用这个账号连接ad域,获取所有域用户信息
用LdapContext,它继承自DirContext
- public Object getAllAdUserNames() {
- List<String> list = new ArrayList<>();
- String username = "lisi@ad.com";
- String password = "123@abc.com";
- String url = "ldap://192.168.44.40:389"; //使用ldap协议连接windows ad域,缺省端口是389
- Hashtable env = new Hashtable();
- env.put(Context.SECURITY_AUTHENTICATION, "simple");//"none","simple","strong"
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, url);
- env.put(Context.SECURITY_PRINCIPAL, username);
- env.put(Context.SECURITY_CREDENTIALS, password);
- NamingEnumeration results = null;
- try {
- LdapContext ctx = new InitialLdapContext(env,null);
- SearchControls searchControls = new SearchControls();
- searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
- String searchBase = "DC=ad,DC=com";
- // String returnedAtts[] = {"memberOf"};
- //获取登录名,samaccountname是兼容windows2000以前系统的(如:lisi),userprincipalname是带域名的登录名(如:lisi@ad.com)
String returnedAtts[] = {"samaccountname", "userprincipalname"};- searchControls.setReturningAttributes(returnedAtts);
- NamingEnumeration<SearchResult> result = ctx.search(searchBase,searchFilter,searchControls);
- while (result.hasMoreElements()) {
- SearchResult searchResult = (SearchResult) result.next();
- list.add(searchResult.getName());
- System.out.println("[" + searchResult.getName() + "]");
- }
- ctx.close();
- } catch (AuthenticationException e) {
- e.printStackTrace();
- return e.toString();
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- return e.toString();
- } catch (NamingException e) {
- e.printStackTrace();
- return e.toString();
- } finally {
- if (results != null) {
- try {
- results.close();
- } catch (Exception e) {
- }
- }
- }
- return list;
- }
2、用DirContext,与上边略有区别
- public List<String> getAllPersonNames() {
- String username = "lisi@ad.com";
- String password = "123@abc.com";
- Hashtable env = new Hashtable();
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, "ldap://192.168.44.40:389/dc=ad,dc=com");
- env.put(Context.SECURITY_PRINCIPAL, username);
- env.put(Context.SECURITY_CREDENTIALS, password);
- DirContext ctx;
- try {
- ctx = new InitialDirContext(env);
- } catch (NamingException e) {
- throw new RuntimeException(e);
- }
- List<String> list = new ArrayList<>();
- NamingEnumeration<SearchResult> results = null;
- try {
- SearchControls controls = new SearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
- results = ctx.search("", searchFilter, controls);
- while (results.hasMoreElements()) {
- SearchResult searchResult = results.next();
- Attributes attributes = searchResult.getAttributes();
- Attribute attr = attributes.get("cn");
- String cn = attr.get().toString();
- list.add(cn);
- }
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- } catch (NamingException e) {
- e.printStackTrace();
- } finally {
- if (results != null) {
- try {
- results.close();
- } catch (Exception e) {
- // Never mind this.
- }
- }
- if (ctx != null) {
- try {
- ctx.close();
- } catch (Exception e) {
- // Never mind this.
- }
- }
- }
- return list;
- }
3、用Spring集成ldap
- 依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-ldap</artifactId>
- </dependency>
application.yml的配置,一种方式自定义ldap,一种是直接采用spring data集成
3.1自定义,重载LdapTemplate
application.yml
- #自定义的ldap config
- ldap:
- base: OU=开发部,DC=ad,DC=com
- url: "ldap://192.168.44.40:389"
- username: xu.dm@ad.com
- password: "123@abc.com"
- referral: follow
- LdapConfig,referral参数具体含义不明确,可以注销了
- @Configuration
- public class LdapConfig {
- @Value("${ldap.url}")
- private String ldapUrl;
- @Value("${ldap.base}")
- private String ldapBase;
- @Value("${ldap.username}")
- private String ldapUserDn;
- @Value("${ldap.password}")
- private String ldapUserPwd;
- @Value("${ldap.referral}")
- private String ldapReferral;
- @Bean
- public LdapTemplate ldapTemplate() {
- return new LdapTemplate(contextSourceTarget());
- }
- @Bean
- public LdapContextSource contextSourceTarget() {
- LdapContextSource ldapContextSource = new LdapContextSource();
- ldapContextSource.setUrl(ldapUrl);
- ldapContextSource.setBase(ldapBase);
- ldapContextSource.setUserDn(ldapUserDn);
- ldapContextSource.setPassword(ldapUserPwd);
- // ldapContextSource.setReferral(ldapReferral);
- ldapContextSource.setPooled(false);
- ldapContextSource.afterPropertiesSet();
- return ldapContextSource;
- }
- }
- @Service
- public class LdapServiceImpl implements LdapService {
- @Resource
- LdapTemplate ldapTemplate;
- @Override
- public Iterable<User> getUserList(String cn) {
- LdapQuery query = LdapQueryBuilder.query().attributes("cn").where("objectclass")
- .is("user").and("cn").is(cn);
- return ldapTemplate.find(query,User.class);
- }
- @Override
- public User create(User user) {
- ldapTemplate.create(user);
- return user;
- }
- @Override
- public void delete(User user) {
- ldapTemplate.delete(user);
- }
- }
- @Override
- public Iterable<User> findAll() {
- return ldapTemplate.findAll(User.class);
- }
- }
实体:
- @Entry(base = "dc=ad,dc=com", objectClasses = {"top","person"})
- public class User implements Serializable {
- @Id
- @JsonIgnore
- private Name dn;
- // @DnAttribute(value = "distiguishedName")
- // private String distinguishedName;
- @Attribute(name = "cn")
- // @DnAttribute(value="cn", index=1)
- private String commonName;
- @Attribute(name = "sn")
- private String suerName;
- @Attribute(name="userPassword")
- private String userPassword;
- // @DnAttribute(value="ou", index=0)
- @Attribute(name="ou")
- private String organizaitonUnit;
- @Attribute(name="displayName")
- private String displayName;
- public User() {
- }
- public User(String commonName, String organizaitonUnit) {
- Name dn = LdapNameBuilder.newInstance()
- .add("ou",organizaitonUnit)
- .add("cn",commonName)
- .build();
- this.dn = dn;
- this.commonName = commonName;
- this.organizaitonUnit = organizaitonUnit;
- }
- 。。。 。。。略
- }
3.2 Spring data集成方式
application.yml
- #spring data方式
- spring:
- ldap:
- base: OU=开发部,DC=ad,DC=com
- urls: "ldap://192.168.44.40:389"
- username: xu.dm@ad.com
- password: "123@abc.com"
- public interface UserRepository extends LdapRepository<User> {
- }
- @Service
- public class LdapServiceImpl implements LdapService {
- @Resource
- UserRepository userRepository;
- @Override
- public User findOne(String cn) {
- LdapQuery query = LdapQueryBuilder.query().attributes("cn").where("objectclass")
- .is("person").and("cn").is(cn);
- return userRepository.findOne(query).orElse(null);
- }
- }
获取和验证Windows AD域的用户信息的更多相关文章
- Windows AD域升级方
前面的博客中我谈到了网络的基本概念和网络参考模型,今天我们来谈企业中常用的技术,Windows AD 域,今天我的笔记将重点讲解Windows AD 域的升级和迁移方法,通过3个小实验进行配置,真实环 ...
- Windows AD域管理软件是什么?
Windows AD域管理软件是什么? ADManager Plus是一个简单易用的Windows AD域管理工具,帮助域管理员简化日常的管理工作.通过直观友好的操作界面,可以执行复杂的管理操作,比如 ...
- jsonp跨域实现单点登录,跨域传递用户信息以及保存cookie注意事项
网站A:代码:网站a的login.html页面刷新,使用jsonp方式将信息传递给b.com的login.php中去,只需要在b.com中设置一下跨域以及接收参数,然后存到cookei即可, 注意:网 ...
- asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件
原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...
- ASP.NET站点Windows身份验证集成AD域,非LDAP
站点集成AD域验证 服务器机器入域 计算机右键属性-->“更改设置”-->“更改”-->填写所属域,确认后重启机器生效. 部署测试站点,localhost.ip.域名三种方式登录效果 ...
- windows AD域安装及必要设置
一.安装AD域 运行dcpromo命令,安装AD域. 步骤: 1.win+R 2.dcpromo 图例: 百度百科关于“dcpromo”解释: dcpromo命令是一个“开关”命令.如果Windows ...
- AD域 根据 用户属性userAccountControl 来判断用户禁用属性
参考:https://support.microsoft.com/zh-cn/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipu ...
- 将AD域漫游用户配置文件放在samba服务器中
书接上回https://www.cnblogs.com/jackadam/p/11448497.html 我们已经将linux服务器设置为域成员,启动samba服务后,已经实现了使用域账号验证,自动创 ...
- AD域创建用户无法登录
怎么登录都无法登录 解决办法: 创建用户的时候 将用户下次登录时须更改密码的勾去掉 不然需要修改密码才可以登录
随机推荐
- TeamViewer卡在正在初始化显示参数
在windows的mstsc远程桌面中打开teamviewer,远程桌面开着的时候可以连接teamviewer,但是当我断开mstsc之后,再用teamviewer连就连接不上了,一直都是正在初始化显 ...
- 牛客小白月赛9 A签到(分数取模,逆元)
传送门 对分母求一下逆元,把除法取模变成乘法取模,逆元介绍看这里 这种方法只适合模为质数的情况 #include<bits/stdc++.h> using namespace std; ; ...
- 解析build.gradle文件
Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言DSL来声明项目设置,摒弃了传统XML(如Ant和Maven)的各种繁琐配置 项目结构如上图: 1.最外层目录下的b ...
- jmeter逻辑控制器
刚开始学习,只写几种了解的逻辑控制器 1.简单控制器 只用来组合采样器和其他逻辑控制器,不影响jmeter的运行 2.循环控制器 用来循环执行采样器和其他逻辑控制器,例如一个用户发送特定请求多次,即可 ...
- 使用MyBatis遇到的一些需要记录下的问题
(1)MyBaits结果集返回Map,Map集合乱序. xml 中的SQL 输出: 改成: 输出: 目测跟字母顺序有关:ABCDEFGHIJKLMNOPQRSTUVWXYZ (2)需要对字段动态排序 ...
- Linux系统进程管理
Linux系统进程管理 什么是进程 进程是已启动的可执行程序的运行实例,进程有以下组成部分: 分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程 ...
- 20172305 暑假作业 之 TimeCalculate & Save Iron Man
20172305 暑假作业 之 TimeCalculate & Save Iron Man TimeCalculate 项目介绍 项目名称: TimeCalculate 项目简介: 本项目基于 ...
- 每日Scrum--No.2
Yesterday:找地图 Today: 找到最适合我们软件的地图版本 Problem:找不到特别匹配的版本
- 使用C和C++实现“电梯”的区别
C 面向过程: 该电梯不允许未卜先知,故程序需逐条处理乘客请求并更新当前各变量状态. 如何获得最短时间:是否立即响应请求,计算出不同决策下的总时间,并进行比较,然后选择最短时间 ...
- 【树上DFS】Tree and Polynomials
http://codeforces.com/gym/101372 D push1[i][k]:所有操作1总共要让节点i下推多少系数k push2[i][k]:所有操作2总共要让节点i上推多少系数k s ...