用java进行LDAP用户登陆(用户认证)及修改密码
為什么80%的碼農都做不了架構師?>>> ??
一、用戶認證
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?thesearchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);?//?Specify//設置查詢的屬性,根據登陸用戶姓名獲取ouString?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();//設置sessionsession.put("distinguishedname",?distinguishedname);//認證成功,返回successSystem.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();//初始化ldapcontextLdapContext?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?blocke1.printStackTrace();}}?????????? }代碼寫的非常的爛,只是簡單的實現了功能,希望大家多拍磚。
java對AD域的密碼修改!!證書導入!!!
Java通過Ldap操作AD的增刪改查詢
有問題可以留言。
轉載于:https://my.oschina.net/qiaojj/blog/494556
總結
以上是生活随笔為你收集整理的用java进行LDAP用户登陆(用户认证)及修改密码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone8是双卡吗(iPhone8是
- 下一篇: 小米8电池耐用吗(小米官方售后服务)