博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java如何登陆域后直接进系统_AD域账户自动登陆(仅限IE浏览器)Java简单实现
阅读量:5106 次
发布时间:2019-06-13

本文共 5896 字,大约阅读时间需要 19 分钟。

实现流程:同步域账户用户名至项目数据库-》若是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 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用户名并且提交登陆表单,代码如下:

$(function(){

// 登陆失败和退出系统操作都会返回error信息,通过判断error是否为空控制系统在用户退出及需要输入账号密码时不使用AD域登陆

// 判断浏览器是不是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);

}

}

})

步骤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);

}

转载地址:http://jqudv.baihongyu.com/

你可能感兴趣的文章
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止...
查看>>
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>