IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 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);
        }
        //验证身份,获得ldapContext
        checkLdapLogin(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()) {
                    //总数加1
                    totalResults++;
                    //处理查询到的结果
                    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;
    }
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:06:51  更:2022-04-23 11:07:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:06:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码