AD域賬戶自動登陸(僅限IE瀏覽器)Java簡單實現


實現流程:同步域賬戶用戶名至項目數據庫-》若是IE瀏覽器則通過ActiveXObject獲取PC用戶名-》根據用戶名查詢數據庫-》存在則自動登陸

 

步驟1:通過定時任務同步AD域賬戶用戶名,代碼如下

package com.honsto.edusys.job;
 
import java.util.Date;
import java.util.Hashtable;
 
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
 
import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
 
import com.honsto.core.common.base.ApplicationContextBeanUtil;
import com.honsto.edusys.domain.Member;
import com.honsto.edusys.service.MemberService;
/**
 * 獲取新增AD域教師用戶保存至數據庫
 * 
 * @author liming
 *
 */
public class AddTeacherJob extends QuartzJobBean {
	private final Logger log = Logger.getLogger(this.getClass());
 
	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException {
		String jobTitle = this.getClass().getSimpleName();
		log.info(jobTitle + " start");
		ApplicationContextBeanUtil adb=new  ApplicationContextBeanUtil();
		try {
			Date now = new Date();
			long start = now.getTime();
			int generalNum = 0;
			MemberService memberService = (MemberService)adb.getBean("memberService");
			
			String host = "192.168.0.1"; // AD服務器IP
			String port = "389"; // 端口
			String username = "example@dbwzx.com";
			String password = "examplepassword";
			String url = new String("ldap://" + host + ":" + port);
			Hashtable env = new Hashtable();
			DirContext ctx = null;
			env.put(Context.SECURITY_AUTHENTICATION, "simple");// 一種模式,不用管,就這么寫就可以了
			env.put(Context.SECURITY_PRINCIPAL, username);
			env.put(Context.SECURITY_CREDENTIALS, password);
			env.put(Context.INITIAL_CONTEXT_FACTORY,
					"com.sun.jndi.ldap.LdapCtxFactory");
			env.put(Context.PROVIDER_URL, url);
			
			try {
				ctx = new InitialDirContext(env);
				SearchControls searchCtls = new SearchControls();
				searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
				String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
				String searchBase = "DC=dbwzx,DC=com";
				String returnedAtts[] = {"userPrincipalName"};
				searchCtls.setReturningAttributes(returnedAtts);
				NamingEnumeration<SearchResult> answer = ctx.search(searchBase,
						searchFilter, searchCtls);
				// 初始化搜索結果數為0
				int totalResults = 0;
				while (answer.hasMoreElements()) {
					SearchResult sr = (SearchResult) answer.next();
					// 判斷是否是OU=學校下的數據
					if (sr.getName().indexOf("OU=學校") > 0) {
						Member member = null;
			    	    String memberUserName = null;
						Attributes Attrs = sr.getAttributes();// 得到符合條件的屬性集
						if (Attrs != null) {
							try {
								for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
									Attribute Attr = (Attribute) ne.next();// 得到下一個屬性
									// 如果屬性名是userPrincipalName
									if("userPrincipalName".equals(Attr.getID().toString())){
										System.out.println("*********************************************************************");
										System.out.println(" 屬性名:"+ Attr.getID().toString());
										// 讀取屬性值
										for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
											memberUserName = e.next().toString();
											System.out.println(" 屬性值:"+ memberUserName);
									    }
										System.out.println("*********************************************************************");
									}
									break;
								}
						    } catch (javax.naming.NamingException e) {
						    	System.err.println("Throw Exception : " + e);
						    }
						}
						
						member = memberService.findMemberByLoginName(memberUserName);
						if(member != null){
						    continue; // 跳過
					    } else {
						    generalNum ++;
					  	    // 初始化保存
						    member = new Member();
						    member.setUsername(memberUserName);
						    memberService.saveMember(member);
					    }
					}
				}
			} catch (AuthenticationException e) {
				System.out.println("身份驗證失敗!");
				e.printStackTrace();
			} catch (javax.naming.CommunicationException e) {
				System.out.println("AD域連接失敗!");
				e.printStackTrace();
			} catch (Exception e) {
				System.out.println("身份驗證未知異常!");
				e.printStackTrace();
			} finally {
				if (null != ctx) {
					try {
						ctx.close();
						ctx = null;
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			
			long end = System.currentTimeMillis();
			log.info(jobTitle + " end,used:" + ((end - start) /1000) + "seconds, add size:->" + generalNum);
		} catch (Exception e) {
			log.error(jobTitle + " Exception:", e);
		} 
	}
 
}

  步驟2:在IE瀏覽器下獲取PC用戶名並且提交登陸表單,代碼如下:

<script type="text/javascript">
	$(function(){
		// 登陸失敗和退出系統操作都會返回error信息,通過判斷error是否為空控制系統在用戶退出及需要輸入賬號密碼時不使用AD域登陸
		<c:if test="${empty error}">
			// 判斷瀏覽器是不是ie
			var isIE = false;
			var userAgent = navigator.userAgent; //取得瀏覽器的userAgent字符串
	        var isOpera = userAgent.indexOf("Opera") > -1;
	        if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
	            isIE = true;
	         }; 
	        // 因為ie10-ie11的版本問題,不再支持document.all判斷,所以ie判斷函數要重新寫了
	        if(!isIE){
	            isIE = !!window.ActiveXObject || "ActiveXObject" in window;
	        }
			// 如果是ie,則獲取以下信息並登陸
			if(isIE){
            	try
			    {
			    	var WshNetwork = new ActiveXObject("WScript.Network");
		            jQuery("#browserName").val("IE");
					jQuery("#userOfAD").val(WshNetwork.UserName);
					alert(WshNetwork.UserName);
	            	jQuery("#form1").submit(); 
			    }
			    catch(e)
			    {
			    	var promptStr = "自動登錄需要允許ActiveXObject腳本運行,請您先進行設置!"
			    		+ "\n設置步驟:在“IE-Internet選項-安全-自定義級別-ActiveX控件和插件-對未標記為可安全執行腳本的ActivesX控件”,設置為“提示”或“啟用”";
			    	alert(promptStr);
			    }
	        }
		</c:if>
	})
	
</script>

  步驟3:修改Controller,用戶使用IE瀏覽器時根據用戶名查詢數據庫,根據查詢結果進行相應操作,代碼如下:

// IE瀏覽器
        if ("IE".equals(browserName)) {
            // AD域登錄
            String userOfAD = request.getParameter("userOfAD");
            
            if(StringUtils.isBlank(userOfAD)){
            	// 登陸錯誤返回登陸頁
                return new ModelAndView("login", map);
            }
            
            // 判斷改AD用戶是否存在
            System.out.println("當前用戶名" + userOfAD);
            Member member = memberService.findMemberByLoginName(userOfAD);
            if (member != null) {
                member.setLastLoginDate(new Date());
                memberService.updateMember(member);
                request.getSession().setAttribute(Constant.USER, member);
                if (StringUtils.isNotBlank(returnURL)) {
                    response.sendRedirect(returnURL);
                    return null;
                }
                return new ModelAndView(
                        new RedirectView(
                                "/list.do"),
                        map);
            }
 
            map.put("error", "noadusername");
            // 登陸錯誤返回登陸頁
            return new ModelAndView("login", map);
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM