java 域用户登陆_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 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);
}
java 域用户登陆_AD域账户自动登陆(仅限IE浏览器)Java简单实现相关推荐
- 域用户绑定计算机,域批量绑定用户帐户与计算机帐户
在域中可以通过限制将用户帐户与计算机帐户进行绑定从而实现某个帐户只能在特定的计算机上登录系统及访问域内的资源. 在服务器上,选中一个域用户,属性,账户,登陆到,下列计算机,填上指定的计算机完整的名称, ...
- AD域统一管理计算机安装软件,微软域和AD域的计算机统一安装 域用户安装软件域客户端PC批量分配自动安装教程...
新建的VNC右键点编辑 打开计算机配置-策略-软件设置-软件安装 软件安装-右键新建数据包,从域控AD1的共享中选择TightVNC.msi添加进入,跳出的部署软件窗口,选择已分配 需要注意,这里路径 ...
- 利用dns特性把普通域用户提升到域管理员权限
翻译自:https://medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83 ...
- 计算机日志查询域用户登录记录,域用户权限|查看日志
域用户权限|查看日志.如果委派特定用户查看DC的系统日志? 回答:根据您的描述,我对这个问题的理解是:您想指定特定的用户允许查看DC上的事件日志. 根据我的研究,要允许特定用户访问域控制器上的事件日志 ...
- 查找域控命令_AD域控 Dsquery 查询命令实例汇总
在AD管理中,有了查询可以为工作省去很多麻烦. 几个通用的参数: -limit 0 指定传回符合搜寻条件的对象数目,如果值是 0,将传回所有符合的对象.如果不指定此参数,根据默认将只显示前 100 个 ...
- HP1020打印机加入域后,域用户无法使用HP1020域打印功能
企业内部的PC电脑都加入了msits.com的域 ,现有一客户机表现为:域用户无法打印HP1020 打印机是设置在网内的一台已经加入域的机器上.打印机是HP1020的. 连接打印机的电脑本地打印没问题 ...
- ad域 禁用账号_AD域策略如何限制软件运行
1.软件限制策略概论: "软件限制策略"就是来限制用户对软件的运行的.1.1软件限制策略的优先级: 他是利用组策略GPO来 设置的,所以可以在本地计算机.站 ...
- 查找域控命令_AD 域控查询命令 dsquery
AD DS 管理工具命令 描述: 该工具的命令集允许您根据指定的标准查询目录. 除 dsquery * 之外 (dsquery * 可以查询任何类型的对象), 以下每一个 dsquery 命令均可查找 ...
- java 文字转语音_java 实现文字转语音 -仅限windows系统
1. 下载资源jacob 将.dll文件添加到jre下的bin文件夹下 64位操作系统选择jacob-1.18-x64.dll文件 32位操作系统选择jacob-1.18-x86.dll 链接:htt ...
最新文章
- EAI的Spring集成教程
- java 循环stringbuffer_java常用类-----StringBuilder和StringBuffer的用法
- STM32F407之常识
- 【Packet Tracer 实验笔记5】
- 【Elasticsearch】es 面试题 积累
- 机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
- 网络管理中的安全保障
- python后台架构Django教程——templates模板
- 子盒子width为父盒子width的百分比注意
- pythonlauncher可以卸载吗_python的launcher用法知识点总结
- 通过代码下载全国范围详细区县行政区Shp数据
- ElasticJob 3.0 带你快速入门
- 数据结构-左倾红黑树
- 保存网页html 有什么,保存网页时HTML和MHTML区别在哪里
- 网卡offload功能介绍
- XPDL与WS-BPEL的比较之二:二者内容的大致概述
- 《四世同堂》金句摘抄(十)
- 【微信小程序】判断手机号是否合法
- 实用技巧| 电脑系统提升20%上网速度,记得学会拿去装X哈
- s5pv210 linux内核移植,S5PV210-kernel-从三星官方的内核开始移植