前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java - LDAP实现AD域单点登录

Java - LDAP实现AD域单点登录

作者头像
断痕
发布2021-01-21 15:02:15
4.1K0
发布2021-01-21 15:02:15
举报
文章被收录于专栏:edlcloudedlcloud

概述

公司有一个项目需要和客户服务器winserver2016进行域联动实现单点登录。

调查了一番,发现客户使用的是Active Directory(活动目录)。

研究了一下使用LDAP进行连接AD域就能够实现需求了。

具体内容

一、代码

代码语言:javascript
复制
import org.springframework.stereotype.Service;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;

@Service
public class UserLoginServicelmpl implements UserLoginService {

    @Override
    public String ldapLogin(String username, String password) {

        DirContext ctx = null;
        //通过ldap登录
        Hashtable ldap = new Hashtable();
        ldap.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        //ad域地址:windos server上输入ipconfig查看,369是固定端口,dc=yiduanhen,dc=com是域的范围
        ldap.put(Context.PROVIDER_URL, "ldap://192.168.1.102:389/dc=yiduanhen,dc=com");
        //ad域登录用户
        ldap.put(Context.SECURITY_PRINCIPAL, username);
        //ad域登录密码
        ldap.put(Context.SECURITY_CREDENTIALS, password);

        try {
            //登录验证
            ctx = new InitialDirContext(ldap);
            ctx.close();
        } catch (NamingException e) {
           e.printStackTrace();
        }
        return "登录成功";
    }
}

二、通过AD域查询用户信息

代码语言:javascript
复制
        int row = 0;
        //LDAP搜索过滤器类
        String searchFilter = "objectClass=User";
        //搜索控制器
        SearchControls searchCtls = new SearchControls();
        //创建搜索控制器
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        //定制返回属性sn=姓,givenName=名
        String returnedAtts[] = {"sn", "givenName"};
        //设置返回属性集
        searchCtls.setReturningAttributes(returnedAtts);
        //域节点组织OU="组织名称"("OU="",DC="",DC="",DC="",DC="";)
        String searchBase = "OU=p";
        //根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
        NamingEnumeration answer = ctx.search(searchBase, searchFilter,
                searchCtls);
        //遍历结果
        while (answer.hasMoreElements()) {
            //得到符合搜索条件的DN
            SearchResult sr = (SearchResult) answer.next();
            String dn = sr.getName();
            //返回
            String match = dn.split("CN=")[1].split(",")[0];
            if (usnerName.equals(match)) {
                //得到符合条件的属性集
                BasicAttributes Attrs = (BasicAttributes) sr.getAttributes();
                if (Attrs != null) {
                    try {
                        Iterator ite = Attrs.getIDs().asIterator();
                        for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore(); ) {
                            Attribute Attr = (Attribute) ne.next();
                            //取值
                            for (NamingEnumeration e = Attr.getAll(); e.hasMore(); row++) {
                                String keyId = (String) ite.next();
                                switch (keyId) {
                                    case "sn":
                                        return e.next().toString();
                                    case "givenName":
                                        return e.next().toString();
                                }
                            }
                        }
                        ctx.close();
                    } catch (NamingException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 具体内容
    • 一、代码
      • 二、通过AD域查询用户信息
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档