Java 域登录 实现

  • 前言
    • 新建一个测试类
    • AD域的userName和passWord身份验证成功之后返回
    • 身份验证失败之后返回
      • 验证成功后将之代入项目登录的位置,根据自己的登录接口和登陆逻辑来修改,我这里是SysLoginService

前言

因为最近公司需要项目进行域账号的登录,查找了许多资料,都是零零散散的,所以在这里整理一下步骤,希望帮到大家

新建一个测试类

package com.numberone.web.controller.common;import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;/*** Created by kelvan.cai on 2019/6/10 0010.*/
public class AdLogin {public static void main(String[] args) {String userName = "123@qq.com";//AD域认证,用户的登录UserNameString password = "123";//AD域认证,用户的登录PassWordString host = "*.*.*.*";//AD域IP,必须填写正确 *号改为自己的IPString domain = "@qq.com";//域名后缀,例.@noker.cn.com 对应userName@String port = "389"; //端口,一般默认389String url = new String("ldap://" + host + ":" + port);//固定写法String user = userName.indexOf(domain) > 0 ? userName : userName+ domain;//网上有别的方法,但是在我这儿都不好使,建议这么使用Hashtable env = new Hashtable();//实例化一个EnvDirContext ctx = null;env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别(none,simple,strong),一种模式,这么写就行env.put(Context.SECURITY_PRINCIPAL, user); //用户名env.put(Context.SECURITY_CREDENTIALS, password);//密码env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");// LDAP工厂类env.put(Context.PROVIDER_URL, url);//Urltry {ctx = new InitialDirContext(env);// 初始化上下文System.out.println("身份验证成功!");} 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();}}}}}

AD域的userName和passWord身份验证成功之后返回

Connected to the target VM, address: '127.0.0.1:62276', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:62276', transport: 'socket'
身份验证成功!Process finished with exit code 0

身份验证失败之后返回

Connected to the target VM, address: '127.0.0.1:62380', transport: 'socket'
身份验证失败!
Disconnected from the target VM, address: '127.0.0.1:62380', transport: 'socket'
javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1 ]at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3154)at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3100)at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2886)at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2800)at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:319)at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192)at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153)at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)at javax.naming.InitialContext.init(InitialContext.java:244)at javax.naming.InitialContext.<init>(InitialContext.java:216)at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:101)at com.numberone.web.controller.common.AdLogin.main(AdLogin.java:32)Process finished with exit code 0
验证成功后将之代入项目登录的位置,根据自己的登录接口和登陆逻辑来修改,我这里是SysLoginService

####### 另外说明一下域账号验证成功后需要保存用户名才能进行正常的登录操作,否则登录有验证用户功能的话会报无法找到用户,导致无法正常登录,看下面正常的代码代入域登录

/*** 登录校验方法* * @author kelvan.cai*/
@Component
public class SysLoginService
{@Autowiredprivate ISysUserService userService;/*** 登录*/public SysUser login(String username, String password){// 验证码校验if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));throw new CaptchaException();}String userName = username;//AD域认证,用户的登录UserNameString passWord = password;//AD域认证,用户的登录PassWordString host = "*.*.*.*";//AD域IP,必须填写正确 *号改为自己的IPString domain = "@qq.com";//域名后缀,例.@noker.cn.com 对应userName@String port = "389"; //端口,一般默认389String url = new String("ldap://" + host + ":" + port);//固定写法String user2 = userName.indexOf(domain) > 0 ? userName : userName+ domain;//网上有别的方法,但是在我这儿都不好使,建议这么使用Hashtable env = new Hashtable();//实例化一个EnvDirContext ctx = null;env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别(none,simple,strong),一种模式,这么写就行env.put(Context.SECURITY_PRINCIPAL, user2); //用户名env.put(Context.SECURITY_CREDENTIALS, passWord);//密码env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");// LDAP工厂类env.put(Context.PROVIDER_URL, url);//Urlboolean flag=false;try {ctx = new InitialDirContext(env);// 初始化上下文System.out.println("身份验证成功!");flag=true;} catch (AuthenticationException e) {System.out.println("身份验证失败!");AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));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();}}}if(flag){//验证成功System.out.println("域登录验证成功!");//域登录验证成功之后获取用户名保存进数据库SysUser userAD = new SysUser();userAD.setLoginName(userName);userAD.setUserName(userName);if(userService.selectUserByLoginName(userName) == null){userService.insertUser(userAD);}else{System.out.println("用户已存在!");}}else{//验证失败System.out.println("域登录验证失败!");}

#####到这里就可以将代码跑起来,然后用AD域账号来登录啦!
##欢迎大家加我QQ交流 360056605

Java AD域登录实现正常本地登录操作相关推荐

  1. 集成AD域,前端实现免登录

    转载自添加链接描述 javaweb应用程序与AD域身份认证 首先,要做统一身份认证,也就是说,要java应用程序去ad域验证这个人的用户名密码是否存在于ad域,这个比较简单,只有一个坑,直接上代码吧. ...

  2. 自学项目1:登录路由器(本地登录以及模拟远程登录)

    项目背景:如果你需要查看路由器的各种信息,或者需要修改路由器的现有配置,或者需要对新购的路由器进行配置,由于路由器没有键盘和显示器,那么你首先要从计算机登录到路由器. 为什么要登录?如何登录? 很多人 ...

  3. Ad域控之Ldaps以及Python操作

    背景 Python调用域控用来拿取用户信息. Windows10 添加ad域操作的功能 设置-->应用和功能-->可选功能--->Active Directory 用户和计算机 参考 ...

  4. 网站识别Windows AD 域账号,并自动登录

    KDC (windows 2008): 10.0.2.12 (也就是域服务器) Workstation (windows 10): 10.0.2.100(也就是公司域内电脑) Webserver (C ...

  5. Java实现AD域登录认证

    最近公司派遣去乙方公司做项目开发,之前做好了的登录模块,按理来说是可以完全复用的,但是乙方客户提出要求,要用AD域登录认证的方式进行登录我们开发的Java Web系统,于是上网搜集了相关的资料,并运用 ...

  6. AD域禁止域用户使用本地账户登录

    禁止域用户使用本地账户登录 1.禁止使用用户使用本地账户登录禁止的是设置计算机权限,而不是账号权限. 打开Active Directory用户和计算机 找到computers,computers下面都 ...

  7. windows server2016创建AD域账户并登录

    上篇介绍了Windows Server2016下安装配置AD域,查看文章请点这里 接下来介绍创建AD域账户并登录域账户的流程步骤 创建域账户 1)右键AD服务器,选择Active Directory管 ...

  8. AD 域服务简介(二)- Java 获取 AD 域用户

    博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 一.前言 先简单简单回顾上一篇 ...

  9. java修改AD域用户密码使用SSL连接方式

    正常情况下,JAVA修改AD域用户属性,只能修改一些普通属性, 如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改, SSL连接的方式需要操作以下步骤: 1 ...

最新文章

  1. GIS可视化——属性图
  2. js setTimeout()的使用
  3. 8-spark学习笔记-sparksql
  4. 回文树笔记(转自quack_quack)
  5. Oracle/mysql联合查询union、union all
  6. Django:ORM模型类,字段选项,Meta内部类,常见问题处理
  7. Architecture(5)电商APP组件化探索
  8. 称重传感器并联后的误差及附加误差
  9. java getreturntype_java.lang.reflect.Method.getGenericReturnType()方法示例
  10. 一级标题段前段后一行设置方法
  11. Ubuntu安装搜 狗输入法,最完整的步骤
  12. 简单图(simple graph)原理及实现(Java)
  13. 计算机 布局菜单栏 无法打勾,w7系统 我的电脑工具栏不见了
  14. Nginx✧虚拟主机资源静态化
  15. TCP/IP详解卷一读书笔记一
  16. 我的第一个JDBC小项目
  17. 黑客很忙:拿巨额奖金以及帮助警察蜀黍破案|宅客周刊
  18. python框架是什么_python框架是什么?
  19. 如何搭建一个拥有个人域名又带点Geek味的独立博客
  20. HDU 2209 翻纸牌游戏 模拟

热门文章

  1. 徕卡全站仪TS13-徕卡混动全站仪-徕卡1秒全站仪
  2. Discuz 模板使用方法
  3. Word | 最常用的100个通用快捷键
  4. 两向量叉乘的计算公式_矢量叉乘运算的方法是什么?
  5. linux查看显卡算力,nvidiatx2算力
  6. 基于Android安卓医院挂号预约系统软件app
  7. Centos7安装Certbot
  8. Switch游戏机一线直接新能源汽车中控屏方案(65W PD充电+视频传输+数据传输)
  9. PMC Flashtec + Memblaze PBlaze 4 = 性能惊人的NVM Express SSD!
  10. 如何让电子顺磁共振(EPR)定量更准确