LDAP用户登录认证校验 及 LDAP分页查询
某天,老大说,给我一个需求,支持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分页查询相关推荐
- java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...
通过java.namming包实现LDAP用户登录认证,怎么区分账号被冻结.停用.不存在等异常的业务情况呢? 参考的是:网上普遍流传的LDAP连接的代码 public boolean auth(Str ...
- springboot集成shiro实现用户登录认证
Apache Shiro 是一个功能强大且易于使用的Java安全框架,可执行身份验证.授权.加密和会话管理.使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大 ...
- SpringBoot 快速集成 JWT 实现用户登录认证
前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...
- 【Docker】Registry搭建私有仓库、证书认证、用户登录认证
一.Docker Registry工作原理 02_Docker Registry角色 Docker Registry有三个角色,分别是index.registry和registry client. i ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- java用户的登录图片_Java 如何用 token 做用户登录认证
1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...
- Springboot自定义注解实现用户登录状态校验(一)
Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...
- java+登录window域认证网页_Java 如何用 token 做用户登录认证
1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...
- AOD.Net用户登录认证实验
文章目录 AOD.Net用户登录认证实验 一.实验目的 二.实验环境 三.实验内容 四.原理实验步骤 原理: 实验步骤: 五.关键问题及解决方法 六.实验结果 七.实验体会 附录:源代码(仅仅附上核心 ...
最新文章
- 第五次作业:四则运算之升级
- java压缩流的用法_Java对压缩包的操作(解压缩)
- 二叉树(先序遍历)非递归
- POJ - 2559 Largest Rectangle in a Histogram(单调栈)
- sql中添加唯一索引(非主键)
- 电脑可以开机但是黑屏_铅锤哥:十五种电脑开机黑屏的原因与解决思路
- 类型转换和页面获取值(总爱忘的)
- 异常检测时间序列_DeepAnT —时间序列的无监督异常检测
- [华为] 华为交换机接口配置报错指南
- 【详细图文教程】Anaconda的下载及安装
- python 画风场_Python人工智能的味道 - 图像风格迁移
- Effective c++笔记
- 微软收购Yahoo的真正原因
- 概率论与数理统计前两章总结
- 不变初心数——python
- 阿里云的WEB应用防火墙(WAF)能抵挡什么攻击
- flex布局遇到white-space失效问题
- 软件工程 系统测试概述
- js-判断输入值是不是数字、字符串
- javaee入门笔记2