ldap java 密码_用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 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 m = new HashMap();

//校验两次输入的密码是否一致

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();

}

}

}

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

有问题可以留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 中 ConcurrentDictionary 一定线程安全吗?

根据 .NET 官方文档的定义&#xff1a;ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合。这也是我们在并发任务中比较常用的一个类型&#xff0c;但它真的是绝对线程安全的吗&#xff1f;仔细阅读官方文档&#xff0c;我们会发…

java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...

java 中32位秘钥长度的 3des加密方法&#xff1f;java中 3des加密 默认是24位秘钥的现在需求是 32位秘钥加密尝试很多种方法 解决 结果都不正确// 密钥private final static String secretKey "11111111111111111111111111111111";// 向量// private final static S…

2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总

在2019年上海中国.NET开发者大会的基础上&#xff0c;2020年12月19-20日 继续以“开源、共享、创新” 为主题的第二届中国 .NET 开发者峰会&#xff08;.NET Conf China 2020&#xff09;在苏州人工智能智能产业创新中心落下帷幕&#xff0c;本次大会以线下城市苏州为中心&…

java怎么判断数据类型_数据类型判断

[java]代码库import java.util.*; public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String []str = s.split(" "); int i, j; for(i = 0; i < str.length; i++) {if(i != 0) Sys…

.NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

2.3.1 Web API -- REST && RESTful什么是 REST&#xff0c;什么是 RESTfulRESTful API 设计RESTful 成熟度模型什么是 REST&#xff0c;什么是 RESTful理解RESTful架构&#xff1a;https://www.ruanyifeng.com/blog/2011/09/restful.htmlREST&#xff08;Representatio…

vue 一个组件内多个弹窗_论如何用Vue实现一个弹窗-一个简单的组件实现

前言最近在使用element-ui框架&#xff0c;用到了Dialog对话框组件&#xff0c;大致实现的效果&#xff0c;跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下&#xff0c;下面本文会带着大家手摸手实现一个弹窗组件。…

拆分路径 java_JAVA 类文件中的路径如何拆分和替换

我做Swing的时候文件要放绝对路径&#xff0c;相对路径出不来&#xff01;所以我用如果我的类放在D:\aaa\Class里Thread.currentThread().getContextClassLoader().getResource("");MenuTest.class.getClas...我做Swing的时候文件要放绝对路径&#xff0c;相对路径出…

为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持

一个 CefSharp 应用程序要想正确运行&#xff0c;有两个必要条件&#xff1a;.NET Framework 4.5.2VC 2015在部署 CefSharp 应用时经常会遇到因为没有 VC 2015 而无法运行的问题&#xff1a;通过事件查看器&#xff0c;可以观察到一个类型为&#xff1a;System.IO.FileNotFound…

java file rename 失败_java重命名文件造成文件不可读写

我想使用java代码对nginx日志文件进行拆分&#xff0c;但是我发现代码执行之后&#xff0c;拆分出来的日志文件没有读写权限&#xff0c;查看文件属性&#xff0c;显示的很诡异&#xff1a;点击高级按钮&#xff0c;显示你没有权限查看或者编辑这个对象的权限设置&#xff1a;反…

如何在 ASP.NET Core 中使用 Route 特性

ASP.NET Core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上&#xff0c;Route 分两种&#xff1a;基于约定 和 基本特性 模式。基于约定 模式的Route采用集中化的方式&#xff0c;而 基于特性 的方式允许你在 Action 或者 Controller 上单独定义&#x…

java opencsv_用opencsv文件读写CSV文件

首先明白csv文件长啥样儿&#xff1a;用excel打开就变成表格了&#xff0c;看不到细节推荐用其它简单粗暴一点儿的编辑器&#xff0c;比如Notepad&#xff0c;csv文件内容如下&#xff1a;csv文件默认用逗号分隔各列。有了基础的了解就进入主题&#xff0c;用Opencsv读写csv文件…

Beetlex之tcp/tls服务压测工具

在编写tcp服务的时候经常需要对服务的基础性能进行一个压力测试&#xff0c;虽然网上这些工具有很多&#xff0c;但具备使用方便和高强度的测试工具则不多。为了方便这方面的高强度压测所以在beetlex的基础扩展这样一个工具。安装可以访问https://github.com/beetlex-io/TCPBen…

java自动随机字符_java随机字符生成工具

以下是我自己在工作中常用到的&#xff0c;比较好用&#xff0c;分享给大家。package org.phoenix.api.utils;import java.io.UnsupportedEncodingException;import java.util.Random;import java.util.concurrent.ThreadLocalRandom;/*** 随机字符工具类* author mengfeiyang*…

GraphQL:DataLoader的神奇

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余&#xff0c;也让 API 更容易地随着时间推移而演进&#xff0c…

java点击关闭弹出窗口_java – JPopupMenu在子弹出窗口打开时关闭

不可能直接,它很难覆盖已知的bug,在其他手中Swing不允许同时有两个lightwieght弹出组件import javax.swing.*;import java.awt.event.*;public class Test {public static void main(String[] args) {JFrame frame new JFrame();frame.setSize(400, 400);frame.setVisible(tru…

【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷汪宇杰文轩

欢迎来到Azure Show!Azure Show欢迎来到Azure Show 第九期&#xff01;继上期【搭上AI快车】为大家带来数位微软技术专家于各自IT技术领域的经验分享&#xff0c;有2400多人在线上通过b站看了这个特辑的直播&#xff0c;非常非常感恩&#xff01;本期继续和广州图书馆合作&…

java的scanner的方法_Java Scanner reset()方法

Java Scanner reset()方法java.util.Scanner.reset() 方法重置该扫描仪。重设scanner 丢弃所有的这些可能已被useDelimiter(java.util.regex.Pattern)的调用改变其明确的状态信息&#xff0c;useLocale(java.util.Locale)&#xff0c;或useRadix(int)。1 语法public Scanner re…

Abp vNext 后台作业hangfire

概述ABP vNext 提供了后台工作者和后台作业的支持&#xff0c;基本实现与原来的 ABP 框架类似&#xff0c;并且 ABP vNext 还提供了对 HangFire 和 RabbitMQ 的后台作业集成。开发人员在使用这些第三方库的时候&#xff0c;基本就是开箱即用&#xff0c;不需要做其他复杂的配置…

如何在 C# 中使用 委托

委托是一个类型安全的函数指针&#xff0c;它可以引用与委托具有相同签名的方法&#xff0c;你可以利用 委托 实现事件或者回调函数&#xff0c;多播委托 可以引用一个或者多个具有相同签名的方法。理解 委托 本质上来说&#xff0c;委托包含了一个对方法的引用&#xff0c;概念…

java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件

[java 代码 import java.security.Security; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.u用到的JAR包&#xff1a;spring.jarmail.jaractivation.jarcommons-logging.jarlog4j-1.2.15.jarMimeMessage由发送器创建&…