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)
上一篇 2022年4月6日 上午8:00
下一篇 2022年4月6日 上午8:00


相关推荐

  • flex vue 垂直居中居上_flex 垂直居中、两列对齐、自适应宽[通俗易懂]

    flex vue 垂直居中居上_flex 垂直居中、两列对齐、自适应宽[通俗易懂]####flex垂直居中#parent{display:flex;width:300px;height:300px;outline:solid1px;justify-content:center;align-content:center;//主轴居中对齐align-items:center;//交叉轴的中点对齐}#child{width:100px;height:100px;outlin…

    2022年5月6日
    55
  • Linux cpuidle framework(1)_概述和软件架构 — wowo

    Linux cpuidle framework(1)_概述和软件架构 — wowo文章目录 1 前言 2 功能概述 3 软件架构 1 kernelschedu 模块 2 cpuidlecore3 cpuidledrive cpuidlegover 软件流程 1 前言在计算机系统中 CPU 的功能是执行程序 总结起来就是我们在教科书上学到的 取指 译码 执行 那么问题来了 如果没有程序要执行 CPU 要怎么办 也许您会说 停掉就是了啊 确实 是要停掉 但何

    2026年3月19日
    1
  • gFortran的使用

    gFortran的使用Fortran编程中相关文件后缀.a静态库(archive).f,.for,.FOR.ftn*,.f90*,.f95*,.f03*Fortran源代码(不需编译预处理).F,.fpp,.FPP.FTN*,.F90*,.F95*,.F03*Fortran源代码(需要编译预处理).rFortran源代码(需要…

    2025年6月22日
    6
  • cmd查询mysql端口占用_windows cmd快速查看端口占用情况

    cmd查询mysql端口占用_windows cmd快速查看端口占用情况在调试服务或者程序的时候我们经常会通过检测对应端口是否打开来判断服务是否成功启动,本例就拿mysql的3306来实验。再看看3306端口是否已经被占用一、查看端口占用netstat-aon|findstr”3306″二、查看id对应的程序tasklist|findstr”6572″==============================C:\Users\Administrator>…

    2022年5月19日
    32
  • VMM基础_MTM方法

    VMM基础_MTM方法复杂度3/5机密度3/5最后更新2021/04/20VMMVirtualMemoryManagement是所有操作系统都要解决的问题,也是非常硬件相关的问题,必须从硬件CPU的地址管理开始谈起。

    2026年2月15日
    4
  • html iframe 传递数据,iframe参数 怎么传递参数到iframe页面「建议收藏」

    html iframe 传递数据,iframe参数 怎么传递参数到iframe页面「建议收藏」关于使用iframe跳转参数获取问题怎么把URL参数传递到B页面的iframe的C页面里?A页面打开一个B页面的链接,怎么把A页面的URL参数传递到B页面iframe的CA.htmlBB.htmlwindow.onload=function(){varv=document.getElementById(“miao”);v.src=”C.html?p=”+UrlValue(…

    2022年7月13日
    16

发表回复

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

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