文档章节

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

hello_bear
 hello_bear
发布于 2015/08/19 14:40
字数 816
阅读 2847
收藏 1

一、用户认证

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 = "p@ssword";
        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的增删改查询


有问题可以留言。

© 著作权归作者所有

共有 人打赏支持
hello_bear
粉丝 10
博文 46
码字总数 14285
作品 0
海淀
【Ovirt 笔记】engine 用户扩展管理分析与整理

文前说明 作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。 本文仅供学习交流使用,侵权必删。 不用...

羽杰
06/13
0
0
01-Spring Security框架学习

[toc] 01-Spring Security框架学习 简介 Spring Security 是什么 Spring Security 为基于 Java EE 的企业应用提供综合的安全服务。尤其支持使用Spring Framework构建的项目,这是目前企业软件...

weir_will
08/03
0
0
SpringBoot 整合 oauth2(三)实现 token 认证

关于session和token的使用,网上争议一直很大。 总的来说争议在这里: session是空间换时间,而token是时间换空间。session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占...

FantJ
05/14
0
0
Spring Boot2.0使用Spring Security

一、Spring Secutity简介 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括...

大魔王先生
08/20
0
0
Liferay6.1学习笔记(四)--整合CAS实现单点登录

转载:http://www.ibm.com/developerworks/cn/opensource/os-cn-liferay-cas/index.html Liferay 门户介绍 Liferay 是一个基于 J2EE 架构的完整的门户解决方案,使用了 EJB、JMS 等技术, 前...

Michaelyn
2014/01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ehlib 修改 使行号字体颜色 与标题字体颜色 一致

对ehlib 显示效果不够满意,而做的调整 修改这个过程:procedure TCustomDBGridEh.DrawIndicatorCell(ACol, ARow: Longint; AreaCol, AreaRow: Longint; ARect: TRect; AState: TGri......

vga
14分钟前
0
0
Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
16
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部