Java LDAP统一身份认证

不多说直接看代码,如下:importjava.util.Hashtable;importjavax.naming.AuthenticationException;importjavax.naming.Context;importjavax.naming.NamingEnumeration;importjavax.naming.NamingException;import…

大家好,又见面了,我是你们的朋友全栈君。

不多说直接看代码,如下:

import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

/**
 * 用户登陆认证,LDAP跨域认证,通过LDAP对用户进行更新
 * 
 */
public class LdapCheck {

    private static LdapContext ctx = null;
    private static Control[] connCtls = null;

    /**** 定义LDAP的基本连接信息 ******/
    // LDAP的连接地址(ldap://ip:port/)port默认为389
    private static String URL = “?”;
    // LDAP的根DN
    private static String BASEDN = “dc=?,dc=?,dc=?”;
    // LDAP的连接账号(身份认证管理平台添加的应用账号,应用账号格式:uid=?,ou=?,dc=????)
    private static String PRINCIPAL = “uid=?,ou=?,dc=?,dc=?,dc=?”;
    // LDAP的连接账号的密码(身份认证管理平台添加的应用账号的密码)
    private static String PASSWORD = “?”;

    public static void main(String[] args) {

        // 登录用户的用户名和密码
        String username = “?”;
        String password = “?”;
        System.out.println(authenticate(username, password));
        closeCtx();
    }

    // 校验用户名密码的方法
    public static boolean authenticate(String usr, String pwd) {

        boolean valide = false;
        if (pwd == null || pwd == “”)
            return false;
        if (ctx == null) {

            getCtx();
        }
        String userDN = getUserDN(usr);
        if (“”.equals(userDN) || userDN == null) {

            return false;
        }
        try {

            ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
            ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, pwd);
            ctx.reconnect(connCtls);
            valide = true;
        } catch (AuthenticationException e) {

            System.out.println(userDN + ” is not authenticated”);
            System.out.println(e.toString());
            valide = false;
        } catch (NamingException e) {

            System.out.println(userDN + ” is not authenticated”);
            valide = false;
        }
        return valide;
    }

    public static void getCtx() {

        if (ctx != null) {

            return;
        }
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory”);
        env.put(Context.PROVIDER_URL, URL + BASEDN);
        env.put(Context.SECURITY_AUTHENTICATION, “simple”);
        env.put(Context.SECURITY_PRINCIPAL, PRINCIPAL);
        env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
        try {

            // 链接ldap
            ctx = new InitialLdapContext(env, connCtls);
        } catch (javax.naming.AuthenticationException e) {

            System.out.println(“Authentication faild: ” + e.toString());
        } catch (Exception e) {

            System.out.println(“Something wrong while authenticating: ” + e.toString());
        }
    }

    public static void closeCtx() {

        try {

            if (ctx != null)
                ctx.close();
        } catch (NamingException ex) {

        }
    }

    public static String getUserDN(String uid) {

        String userDN = “”;
        try {

            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration<?> en = ctx.search(“”, “uid=” + uid, constraints);
            if (en == null) {

                System.out.println(“Have no NamingEnumeration.”);
            }
            if (!en.hasMoreElements()) {

                System.out.println(“Have no element.”);
            }
            while (en != null && en.hasMoreElements()) {

                Object obj = en.nextElement();
                if (obj instanceof SearchResult) {

                    SearchResult si = (SearchResult) obj;
                    userDN += si.getName();
                    userDN += “,” + BASEDN;
                } else {

                    System.out.println(obj);
                }
                System.out.println();
            }
        } catch (Exception e) {

            System.out.println(“Exception in search():” + e);
        }

        return userDN;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125729.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是堡垒机?为什么需要堡垒机?

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:猿话 www.toutiao.com/i6881462700229329421 什么是堡垒机 堡垒机,即在一个…

    2021年6月27日
    88
  • UML 用例图_uml建模用例图和细化用例

    UML 用例图_uml建模用例图和细化用例UML用例图参考【UML】—用例图用例图初学UML——用例图需求中如何画用例图为什么使用用例图从业务事件、发起事件以及系统如何响应这些事件来建模系统功能的过程。用例建模起源于面向对象建模。概念图形化地描述了谁将使用该系统以及用户希望与系统交互的方式。业务事件的文本描述以及用户如何与系统交互以完成任务。参与者参与者是与系统…

    2022年9月6日
    4
  • Kafka集群安装「建议收藏」

    Kafka集群安装「建议收藏」概览1.上传解压2.修改配置文件3.分发到其他节点下4.启动5.测试6.注意准备安装好ZookeeperJDK版本:1.8.0_141Kafka版本:kafka_2.12-1.1.0工具:Xshell5,Xftp51.上传解压首先在master(随意一台)的主机上的/usr下创建kafka文件夹作为安装路径[root@master~]#cd/usr/[roo…

    2022年4月25日
    46
  • python中保留小数位数_python四舍五入保留两位小数

    python中保留小数位数_python四舍五入保留两位小数在这里插`在这里插入代码`在这里插入代码片`片`入代码片python保留小数位的方法?num=1.22334577901#保留两位小数print(‘{:.2f}’.format(num))print(‘%.2f’%num)print(round(num,2))

    2022年8月12日
    3
  • phpstrom 2021激活码(最新序列号破解)

    phpstrom 2021激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    51
  • 新浪股票接口获取历史数据

    新浪股票接口获取历史数据这两天做了一个调用新浪股票接口获取实时以及历史股票数据的应用,因为新浪没有公开关于其接口的官方文档,所以通过各种百度差了很多关于新浪股票接口的使用,不过大家基本都是转载或者直接复制,对于实时数据的获取讲的很详细,但是缺少获取历史数据的方法。关于实时数据的获取大家可以看这篇博客:实时股票数据接口 经过不懈的努力终于再这篇博文中找到了关于新浪股票历史数据的获取方式腾讯股票接口、和讯网股票接口、新浪股票…

    2022年6月24日
    113

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号