用java進行LDAP使用者登陸(使用者認證)及修改密碼

來源:互聯網
上載者:User

標籤:

一、使用者認證

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使用者登陸(使用者認證)及修改密碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.