文档章节

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

hello_bear
 hello_bear
发布于 2015/08/19 14:40
字数 816
阅读 2300
收藏 1
点赞 1
评论 0

一、用户认证

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
博文 44
码字总数 12731
作品 0
海淀
【Ovirt 笔记】engine 用户扩展管理分析与整理

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

羽杰 ⋅ 06/13 ⋅ 0

SpringBoot 整合 oauth2(三)实现 token 认证

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

FantJ ⋅ 05/14 ⋅ 0

SpringBoot 整合 oauth2(五)实现 jwt 及 扩展

什么是jwt,即 json web token。JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。也是一种token,但是和token有一些不同。 jwt优点: 自包含 防篡改 可自定义扩展 JW...

FantJ ⋅ 05/22 ⋅ 0

Spring Security认证过程

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...

李玉长 ⋅ 05/03 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

linux下jira的安装与配置

一、所需环境与准备。 OS:CentOS 6.5 JDK:Java 1.8 数据库:mysql 5.6 JIRA software :7.10.1 所需安装包见附件。 二、安装JDK 1.8 1、切换至root用户。 2、在usr目录下创建java 3、将jdk...

lel3390 ⋅ 今天 ⋅ 0

JDK 11 特性抢先看:5 月新增三个 JEP

一周前(2018年5月7日),JDK11 新增了三个 JEP 。在 jdk-dev 邮件列表中出现了三封邮件,Mark Reinhold 发表了以下公告: JDK 11 实现了 JEP:324:关于 Curve25519 和 Curve448 的重要协议...

oschina ⋅ 05/16 ⋅ 0

在虚拟机中安装单机Hadoop

安装单机Hadoop系统 一、所用软件版本 虚拟机:VMwareworkstationfull_12.5.2 操作系统:ubuntu-16.04.2-desktop-amd64 HADOOP:hadoop-2.7.3.tar JDK: jdk-8u121-linux-x64.tar 二、JDK的配......

qq_38270906 ⋅ 04/12 ⋅ 0

SpringCloud实践分享-OAuth2认证中心(待完成)

摘要:随着云计算的发展,微服务、前后端分离、DevOps逐渐成为架构主流。而不同于以往的单体应用,微服务大多仅以api形式专递信息,并且无状态(不记录用户登录状态及会话内容),这就为整个...

杨子敬的瞎扯时刻 ⋅ 06/11 ⋅ 0

centos6.5 安装hadoop2.7.6 1master2node

环境采用centos 6.5最小化安装,hadoop下载的hadoop2.7.6.tar.gz安装,Java下载的oracle官网的1.8.0_172的包安装。 参考了别人的文档,遇到了不同的问题。 1. 3台centos6.5 vmware 192.168.17...

简记 ⋅ 04/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 27分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 30分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 31分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 31分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 32分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 33分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 35分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 40分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 46分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部