某天,老大说,给我一个需求,支持LDAP用户登录,一听,哇,这是啥 啥 啥。经过刻苦努力Ctrl+C/V,终于搞出来了,上代码!

了解一下,LDAP(Lightweight Directory Access Protocol)即轻型目录访问协议,是一个协议。

个人觉得这个写的欧克,传送门
好了,来先说ldap用户登录认证吧

   /*** LDAP用户登录认证** @return javax.naming.directory.DirContext* @author Jasmyn* * ldap相关内容* url: ldap://192.168.75.37:389* domain: dc=maxcrc,dc=com* userCode: Jasmyn # cn=Jasmyn,dc=maxcrc,dc=com* password: secret #登录密码(明文)**/public LdapContext checkLdapLogin(String userCode, String password){userCode = userCode.indexOf(dirContextConfig.getDomain()) > 0 ? userCode : userCode + domain;Hashtable env = new Hashtable();// LDAP访问安全级别(none,simple,strong)env.put(Context.SECURITY_AUTHENTICATION, "simple");// LDAP工厂类env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, url);//连接超时设置为5秒env.put("com.sun.jndi.ldap.connect.timeout", "5000");//AD的用户名\密码env.put(Context.SECURITY_PRINCIPAL, userCode);env.put(Context.SECURITY_CREDENTIALS, password);logger.info("LDAP用户登录校验{}:账号{},密码{}。",url, userCode, password);try {//重点啊:若dirContext不为空,验证通过ldapContext = new InitialLdapContext(env, controls);logger.info(dirContextConfig.getManager() + " 身份认证成功");} catch(AuthenticationException var6) {sout("LDAP身份验证失败");} catch(CommunicationException var7) {sout("AD域连接失败");} catch(Exception var8) {sout("LDAP身份验证失败");}return ldapContext;}

一般用到ldap协议那就是为了实现一个账号可登录多个平台嘛,免去一个平台就要创建一个账号的麻烦,因此,当第三方系统接入时候,大部分会同步域用户到当前系统,那,就来同步用户吧,嘿嘿
这里要注意一点,ldap默认查询自带分页,一次1000条,因此,需要分页查询: LdapContext 中自带查询,cookie中会包含页面查询信息

/*** 获取LDAP用户列表* @author Jasmyn* @param searchFilter 查询条件,例如:(objectClass=top)* @param searchBase 查询的基础域名:例如:dc=maxcrc,dc=com 或 @maxcrc.com* @param filterType 过滤用户类型:CN、UID* @return UserInfo(自己业务用户信息)* DEFAULT_LDAP_RETURNEDATTS = "ou,cn,samaccountname,smtp,name,ipphone,mobile,useraccountcontrol,mail,department";**/public List<UserInfo> getLdapUsers(String searchFilter, String searchBase, String filterType){List<UserInfo> adUserList = new ArrayList();if(StringUtil.isEmpty(searchBase)){searchBase = dirContextConfig.getDomain();}else{if(searchBase.startsWith("@")){String[] dcArray = searchBase.substring(1).split("\\.");searchBase = "DC=" + dcArray[0] + ",DC=" + dcArray[1];}}//定制返回类型String[] returnedAtts = DEFAULT_LDAP_RETURNEDATTS.split(",");if(StringUtil.isEmpty(searchBase) || StringUtils.isEmpty(searchFilter)){throw new UserAuthException(AuthExceptionEnum.LDAP_QUERY_WARRING);}//验证身份,获得ldapContextcheckLdapLogin(dirContextConfig.getManager(), dirContextConfig.getPassword());try {//页面大小[1,1000)int  pageSize = 999 ;int totalResults = 0;//用于判断是否还有剩余数据(进行分页)byte[] cookie = null;//创建搜索控制器SearchControls searchCtls = new SearchControls();//设置搜索范围,1、平级检索;2、树形检索searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);//设置返回属性searchCtls.setReturningAttributes(returnedAtts);//开启分页查询ldapContext.setRequestControls(new Control[]{new PagedResultsControl(pageSize, Control.CRITICAL)});do {//根据设置的域节点、过滤器和搜索控制器搜索LDAP得到结果NamingEnumeration search = ldapContext.search(searchBase, searchFilter, searchCtls);if(search == null || !search.hasMoreElements()) {logger.info("未查询到LDAP用户");return adUserList;}while(search != null && search.hasMoreElements()) {//总数加1totalResults++;//处理查询到的结果SearchResult searchResult = (SearchResult)search.next();//这一段业务处理,按自己需求写,下面仅做参考;dealAttrs(attrs)是处理字段代码,不贴了if(StringUtil.isEmpty(filterType)){NamingEnumeration attrs = searchResult.getAttributes().getAll();adUserList.add(dealAttrs(attrs));}else {String name = searchResult.getName();if(name.toUpperCase().contains(filterType.toUpperCase())) {NamingEnumeration attrs = searchResult.getAttributes().getAll();adUserList.add(dealAttrs(attrs));}}}//cookie是一个字节数组,包含了通过PagedResultsControl下一次调用服务器时所需的信息cookie = parseControls(ldapContext.getResponseControls());ldapContext.setRequestControls(new Control[]{new PagedResultsControl(pageSize, cookie, Control.CRITICAL)});} while((cookie != null) && (cookie.length != 0));logger.info("总数={}", totalResults);} catch(Exception var22) {try {throw new Exception("-100");} catch(Exception e) {e.printStackTrace();}} finally {try {ldapContext.close();return adUserList;} catch(Exception var21) {var21.printStackTrace();}}return adUserList;}

LDAP用户登录认证校验 及 LDAP分页查询相关推荐

  1. java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...

    通过java.namming包实现LDAP用户登录认证,怎么区分账号被冻结.停用.不存在等异常的业务情况呢? 参考的是:网上普遍流传的LDAP连接的代码 public boolean auth(Str ...

  2. springboot集成shiro实现用户登录认证

    Apache Shiro 是一个功能强大且易于使用的Java安全框架,可执行身份验证.授权.加密和会话管理.使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大 ...

  3. SpringBoot 快速集成 JWT 实现用户登录认证

    前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...

  4. 【Docker】Registry搭建私有仓库、证书认证、用户登录认证

    一.Docker Registry工作原理 02_Docker Registry角色 Docker Registry有三个角色,分别是index.registry和registry client. i ...

  5. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  6. java用户的登录图片_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  7. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  8. java+登录window域认证网页_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  9. AOD.Net用户登录认证实验

    文章目录 AOD.Net用户登录认证实验 一.实验目的 二.实验环境 三.实验内容 四.原理实验步骤 原理: 实验步骤: 五.关键问题及解决方法 六.实验结果 七.实验体会 附录:源代码(仅仅附上核心 ...

最新文章

  1. 第五次作业:四则运算之升级
  2. java压缩流的用法_Java对压缩包的操作(解压缩)
  3. 二叉树(先序遍历)非递归
  4. POJ - 2559 Largest Rectangle in a Histogram(单调栈)
  5. sql中添加唯一索引(非主键)
  6. 电脑可以开机但是黑屏_铅锤哥:十五种电脑开机黑屏的原因与解决思路
  7. 类型转换和页面获取值(总爱忘的)
  8. 异常检测时间序列_DeepAnT —时间序列的无监督异常检测
  9. [华为] 华为交换机接口配置报错指南
  10. 【详细图文教程】Anaconda的下载及安装
  11. python 画风场_Python人工智能的味道 - 图像风格迁移
  12. Effective c++笔记
  13. 微软收购Yahoo的真正原因
  14. 概率论与数理统计前两章总结
  15. 不变初心数——python
  16. 阿里云的WEB应用防火墙(WAF)能抵挡什么攻击
  17. flex布局遇到white-space失效问题
  18. 软件工程 系统测试概述
  19. js-判断输入值是不是数字、字符串
  20. javaee入门笔记2

热门文章

  1. python 字节流分段_学习Python又多了一种选择,原来是他!
  2. android studio高德地图的基本使用
  3. PHP的各种安全问题总结 一文了解PHP的各类漏洞和绕过姿势
  4. 用1分钟学会4个PPT高效小技巧,3个小时才能完成的工作5分钟搞定~
  5. $con= MySQL有关填空题_mysql练习题和答案.docx
  6. 3S基础知识普及——基本术语
  7. 现代密码学导论-2-古典密码及其密码分析
  8. 计算机网络测试—基本网络连接和通信考试
  9. Kong 网关 | Route
  10. ESP32的蓝牙架构你真的了解吗?来,蓝牙博主给你安排~