用java进行LDAP用户登陆(用户认证)及修改密码

一、用户认证

public String execute(){
	Hashtable env = new Hashtable();
	String LDAP_URL = "ldap://8.8.8.8:389"; // LDAP访问地址
	env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
	env.put(Context.PROVIDER_URL, LDAP_URL);
	env.put(Context.SECURITY_AUTHENTICATION, "simple");
	env.put(Context.SECURITY_PRINCIPAL, username);
	env.put(Context.SECURITY_CREDENTIALS, password);
	try {
		dc = new InitialDirContext(env);// 初始化上下文
		// 域节点
		String searchBase = "DC=abc,DC=com";
		String searchFilter = "cn="+username;
		SearchControls searchCtls = new SearchControls(); // Create the
		searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Specify
		//设置查询的属性,根据登陆用户姓名获取ou
		String returnedAtts[] = {"distinguishedName"};// 定制返回属性
		searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
		// 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
		NamingEnumeration<SearchResult> entries = dc.search(searchBase, searchFilter,searchCtls);
		SearchResult entry = entries.next();
		Attributes attrs = entry.getAttributes();
		String disName = attrs.get("distinguishedname").toString();
		String[] disNameArray = disName.split(":");
		String distinguishedname = disNameArray[1].trim();
		//设置session
	        session.put("distinguishedname", distinguishedname);
	        //认证成功,返回success
		System.out.println("认证成功");//这里可以改成异常抛出。
		return "success";
	} catch (javax.naming.AuthenticationException e) {
		System.out.println("认证失败");
		return "fail";
	} catch (Exception e) {
		System.out.println("认证出错:" + e);
		return "fail";
	}
}

二、修改用户密码

用户认证是相对比较简单的,简单几行代码即可,微软是不允许直接通过java修改密码(C#除外),我们就需要用到证书。

1、在AD域服务器上,添加角色 证书服务器,点这里

2、在IE中,Internate选项->内容->证书->找到自己的证书然后导出。

3、导出的证书,需要导入到一个文件里,这个文件叫cacerts.这个文件在,还需要一个工具keytools.exe。位置:

cacerts : D:\soft\myeclipse2013\binary\com.sun.java.jdk.win32.x86_64_1.6.0.u43\jre\lib\security

keytools : D:\soft\myeclipse2013\binary\com.sun.java.jdk.win32.x86_64_1.6.0.u43\bin

我们需要通过keytools工具,把导出的证书导入到cacerts里,导入的方法是在DOS命令里输入:

D:\soft\myeclipse2013\binary\com.sun.java.jdk.win32.x86_64_1.6.0.u43\bin\keytool -import -keystore D:\soft\myeclipse2013\binary\com.sun.java.jdk.win32.x86_64_1.6.0.u43\jre\lib\security\cacerts -storepass changeit -keypass changeit -alias ca -file D:\ca\ca.cer

复制到dos,回车后提示是否导入,输入“y”即可。这些都做完就该我们的编码了:

public void editPwd() throws NamingException {
	this.setNewPwd(new String(decode(newPwd)));
	this.setConfirmPwd(new String(decode(confirmPwd)));
	//ajax请求的一些代码
	HttpServletResponse response=ServletActionContext.getResponse();
	response.setContentType("text/html; charset=utf-8");  
	Map<String, Object> m = new HashMap<String, Object>();
	//校验两次输入的密码是否一致
	if(!newPwd.equals(confirmPwd)){
        m.put("success", false);
        m.put("msg", "两次密码输入不一致,请重新输入。");
        JSONArray jsonArray = JSONArray.fromObject(m);
        try {
        	PrintWriter out = response.getWriter();
        	out.print(jsonArray.toString());
        } catch (IOException e) {
        	e.printStackTrace();
        }
	}
	//ladp的一些配置
	Hashtable env = new Hashtable();   
        String adminName = "sja\\administrator";
        String adminPassword = "[email protected]";
        String userName = session.get("distinguishedname").toString().replace("%20", " ");
        String newPassword = newPwd;
        String keystore = this.getClass().getResource("").toString().substring(6).replace("%20", " ").replace("/", "\\")+"cacerts";
        System.setProperty("javax.net.ssl.trustStore",keystore);
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION,"simple");   
        env.put(Context.SECURITY_PRINCIPAL,adminName);   
        env.put(Context.SECURITY_CREDENTIALS,adminPassword);   
        env.put(Context.SECURITY_PROTOCOL,"ssl");   
        String ldapURL = "ldap://8.8.8.8:636";   
        env.put(Context.PROVIDER_URL,ldapURL);   
        try {   
            PrintWriter out = response.getWriter();
            //初始化ldapcontext
            LdapContext ctx = new InitialLdapContext(env,null);
            ModificationItem[] mods = new ModificationItem[1];
            String newQuotedPassword = "\"" + newPassword + "\"";   
            byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");   
            mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));   
            // 修改密码
            ctx.modifyAttributes(userName, mods);   
            System.out.println("Reset Password for: " + userName);     
            ctx.close();   
            m.put("success", true);
            JSONArray jsonArray = JSONArray.fromObject(m);
            out.print(jsonArray.toString());
        }    
        catch (NamingException e) {   
            System.out.println("Problem resetting password: " + e);
            m.put("success", false);
            m.put("msg", "密码不符合要求或网络连接错误,请尝试重新输入密码或联系管理员。");
            JSONArray jsonArray = JSONArray.fromObject(m);
            PrintWriter out;
            e.printStackTrace();
	    try {
		out = response.getWriter();
		out.print(jsonArray.toString());
		} catch (IOException e1) {
	    // TODO Auto-generated catch block
	    e1.printStackTrace();
	    }
        }          
}

代码写的非常的烂,只是简单的实现了功能,希望大家多拍砖。

java对AD域的密码修改!!证书导入!!!

Java通过Ldap操作AD的增删改查询

时间: 2024-10-16 07:05:03

用java进行LDAP用户登陆(用户认证)及修改密码的相关文章

【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统

MVC不是一种像C.JAVA的编程语言,也不是一种像Ajax,Servlet的技术,只是一种如同面向对象一样编程思想.近年来MVC一直很火,赞者批者有之,然后大篇幅的文章很多,可是简明扼要的简单MVC的例子几乎没有.在JSP领域一直向鼓风机地猛吹SSH如何如何地好,一直怒批JSP,Servlet等如何如何差.其实使用JSP+Servlet同样可以利用MVC思想来完成一个系统.下面用一个烂得不能再烂的例子,你步入网页编程必须学会的东西,登陆.注册.修改密码系统,来说明这种编程思想. 一.基本目标

如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作

开发共享软件,传统的是采用注册码验证方式,这种方式是大多数共享软件采用的方式,另外还有一种常见的验证方式,就是通过网络授权认证的方式,这种方式通过在程序中调用服务器的服务进行.一般具有验证用户名可用.注册新用户.用户登录认证.用户修改密码等操作,另外还需要配备一个网络授权入口给管理员对注册的用户进行授权控制. 这个是为了进行网络授权认证搭建的一个简单的管理后台,用户在共享软件客户端通过调用服务器的服务连接,可以注册一个新用户,或者进行登录获取身份信息(试用.已注册.已禁用等状态),还可以通过服务

Oracle安装后忘记用户名或密码+创建新登陆用户

新安装的Oracle11g,不料在使用的时候没记住安装时的用户名和密码. 不用担心,打开sqlplus. 按如下步骤,新建一个登陆用户: 第一步:以sys登陆  sys/密码 as sysdba  此处的密码任意字符都能登陆上. sys/manager as sysdba 登陆成功后就可以创建新用户了. 第二步: 创建用户 语法: CREATE  USER 用户名 IDENTIFIED BY 密码create user admin identified by orcl; 将刚创建的用户解锁语法:

【Struts2+Hibernate3+Spring3】利用SSH整合,完成打印用户表,用户登录、注册、修改密码系统

本文视图尽可能不杂糅其它技术,尽可能少写代码,完成SSH整合.以致于各位在现有网上资料越来越天花龙凤之下,清晰地了解到传说中的三大框架SSH是怎么整合的. 一.SSH的下载 首先SSH的下载就已经是一个难点.SSH三个地方同时推出各自的新技术,已经要求利用Maven完成其版本的同步.毕竟Spring的版本,决定其能整合什么版本的Struts与Hibernate.Spring3.0.5就不能整合Hibernate4.x了.因此本文选取的SSH的版本,分别为struts 2.3.20 GA.Hibe

mysql5.7如何修改密码以及密码如何忘记无密码登陆

今天买了一台阿里云服务器,Centos7.3系统,环境是LAMP.学生价9.8元是真的很实惠了.然后想修改一下mysql服务器的密码(mysql版本5.7),结果操作失误,密码给忘记了,导致新旧密码都不能登陆服务器,真是蛋疼.不过最终依靠自己的努力还是解决了问题. 错误案例演示 先来看一下我刚开始是怎么出错的(这是错误案例,大家不要照着这个例子敲,这里先演示了如何出错的,最后再修改): 1.先登陆服务器,use一个数据库"mysql".然后修改user表里面的数据.毕竟mysql的密码

JAVA 通过LDAP获取AD域用户及组织信息

因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的AD域组织和用户信息,实现域认证和单点登录. LDAP: LDAP是轻量目录访问协议 AD域:微软基于域模式的集中化管理 1.常规的AD域登陆验证 LdapContext dc = null;             Hashtable<String, String> env = new Hasht

从 &amp;quot;org.apache.hadoop.security.AccessControlException:Permission denied: user=...&amp;quot; 看Hadoop 的用户登陆认证

假设远程提交任务给Hadoop 可能会遇到?"org.apache.hadoop.security.AccessControlException:Permission denied: user=..." , 当然,假设是spark over YARN, 也相同会遇到相似的问题,比如: ?An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext. : org.apache.hadoop.

Flask中如何实现用户登陆认证?

本文和大家分享的主要是使用Flask实现用户登陆认证的相关知识,希望对大家学习Flask有所帮助. 用户认证的原理 在了解使用Flask来实现用户认证之前,我们首先要明白用户认证的原理.假设现在我们要自己去实现用户认证,需要做哪些事情呢? 1. 首先,用户要能够输入用户名和密码,所以需要网页和表单,用以实现用户输入和提交的过程. 2. 用户提交了用户名和密码,我们就需要比对用户名,密码是否正确,而要想比对,首先我们的系统中就要有存储用户名,密码的地方,大多数后台系统会通过数据库来存储,但是实际上

RHCE7.0答案之使用LDAP作为本地用户认证方式

使用LDAP作为本地用户认证方式配置: 用户信息和验证信息由不同程序提供. yum -y install sssd auth config-gtk krb5-workstation(若不用kerberos验证则不用装) authconfig-gtk 图形界面 ldapuser0:password 由ldap提供 ldapuser0=kerberos 由kerberos提供认证 若是kerberos认证则会提供kerberos地址及realm.example.com grep ldapuser0