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


相关推荐

  • 拣阅一:缘由和系统设计「建议收藏」

    拣阅一:缘由和系统设计

    2022年1月25日
    47
  • HelloWorld的Java代码[通俗易懂]

    HelloWorld的Java代码[通俗易懂]HelloWorld的Java代码//类名publicclassHelloWorld{//主函数,主方法,程序的入口publicstaticvoidmain(String[]args){//输出语句System.out.println(“HelloWorld!”);}}欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎…

    2022年5月28日
    62
  • keil5如何生成bin文件_keil4生成bin文件

    keil5如何生成bin文件_keil4生成bin文件 在RealviewMDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯于使用*.bin格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin格式文件的调试或烧写工具。为了充分地利用现有的工具,同时发挥RealviewMDK集成开发环境的优势,将*.axf格式文件或*.he…

    2022年10月20日
    4
  • HTTP 协议入门

    HTTP 协议入门

    2021年11月4日
    43
  • 汇编指令(四)移位指令

    汇编指令(四)移位指令学习概要格式移位指令主要分四种一、逻辑移位指令1.逻辑左移指令SHL2.逻辑右移指令SHR3.逻辑移位指令的功能二、算术移位指令1.算术左移指令SAL2.算术右移指令SAR最高位不变的意思就是,最高位原来是1(0),右移过后最高位就补1(0)。3.算术移位指令的功能三、循环移位指令1.循环左移指令ROL2.循环右移指令ROR四、带进位的循环移位指令1.带进位的循环左移指令RCL2.带进位的循环右移指令移位指令对标志位的影响1

    2022年6月6日
    40
  • ExcelJS 使用帮助文档

    ExcelJS 使用帮助文档ExcelJS 使用帮助文档个人备忘 原文地址 https github com exceljs exceljs blob master README zh md 安装 npminstallex 新的功能 重大版本更改 主要的 ExcelJS 接口已从基于流的 API 迁移到异步迭代器 从而使代码更简洁 虽然技术上是一个突破性的变化 但大多数 API 都没有变化 详细信息请参见 UPGRADE 4 0 md 此升级来自以下合并 M

    2026年3月17日
    2

发表回复

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

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