標籤:
一、使用者認證
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();//設定session session.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 = "[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的增刪改查詢
用java進行LDAP使用者登陸(使用者認證)及修改密碼