AD域登录验证

作者:Grey

原文地址:http://www.cnblogs.com/greyzeng/p/5799699.html

需求

系统在登录的时候,需要根据用户名和密码验证连接域服务器进行验证此用户是否为域用户。

条件

  • 域服务器地址:x.x.x.x
  • 域验证端口:xxx
  • AD域为:DC=adservice,DC=com
  • 某个域用户是:abc@adservice.com 密码:abc123.

实现

Java版

ADAuthJava.java

package com.hui.advalidationdemo;

import static com.hui.advalidationdemo.constant.ApplicationConstants.buildADPath;
import static com.hui.advalidationdemo.constant.ApplicationConstants.getConfig;
import static javax.naming.Context.INITIAL_CONTEXT_FACTORY;
import static javax.naming.Context.PROVIDER_URL;
import static javax.naming.Context.SECURITY_AUTHENTICATION;
import static javax.naming.Context.SECURITY_CREDENTIALS;
import static javax.naming.Context.SECURITY_PRINCIPAL; import java.util.Hashtable; import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext; public class ADAuthJava { public static boolean authenticate(String username, String password) {
DirContext ctx = null;
Hashtable<String, String> HashEnv = initADServer(username, password);
try {
ctx = new InitialDirContext(HashEnv);
System.out.println("Authenticate Success!");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (null != ctx) {
try {
ctx.close();
ctx = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
} private static Hashtable<String, String> initADServer(String username, String password) {
String adPath = buildADPath(username);
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
HashEnv.put(SECURITY_AUTHENTICATION, "simple");
HashEnv.put(SECURITY_PRINCIPAL, adPath);
HashEnv.put(SECURITY_CREDENTIALS, password);
HashEnv.put(INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
HashEnv.put(PROVIDER_URL, getConfig("ad.url"));
return HashEnv;
}
}

单元测试:ADAuthJavaTest.java

package com.hui.advalidationdemo;

import static com.hui.advalidationdemo.ADAuthJava.authenticate;
import static org.junit.Assert.assertTrue; import org.junit.Test;
public class ADAuthJavaTest {
@Test
public void testAuthenticate() {
assertTrue(authenticate("abc", "abc123."));
}
}

Spring版(附源码,Maven项目)

  • Spring 版本:3.2.3.RELEASE
  • spring-ldap-core 版本:2.0.2.RELEASE
  • JDK1.7+

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.hui</groupId>
<artifactId>advalidationdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>advalidationdemo</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.acegisecurity</groupId>
<artifactId>acegi-security</artifactId>
<version>1.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
</dependencies>
</project>

applicationContext-ldap.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location"><value>classpath:config.properties</value></property>
</bean>
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="${ad.url}" />
<property name="base" value="${ad.base}" />
</bean>
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
<constructor-arg ref="contextSource" />
</bean>
<bean id="adDao" class="com.hui.advalidationdemo.ADAuthSpring">
<property name="ldapTemplate" ref="ldapTemplate" />
</bean>
</beans>

ADAuthSpring.java

package com.hui.advalidationdemo;

import static com.hui.advalidationdemo.constant.ApplicationConstants.buildADPath;
import static org.acegisecurity.ldap.LdapUtils.closeContext; import javax.naming.directory.DirContext; import org.springframework.ldap.core.LdapTemplate; public class ADAuthSpring {
private LdapTemplate ldapTemplate; public void setLdapTemplate(LdapTemplate ldapTemplate) {
this.ldapTemplate = ldapTemplate;
} public boolean authenticate(String userName, String password) {
DirContext ctx = null;
String distinguishedName = null;
distinguishedName = buildADPath(userName);
System.out.println("userName:" + userName + " map distinguishedName:" + distinguishedName);
try {
distinguishedName = buildADPath(userName);
System.out.println("userName:" + userName + " map distinguishedName:" + distinguishedName); ctx = ldapTemplate.getContextSource().getContext(distinguishedName, password);
System.out.println("authenticate success distinguishedName:" + distinguishedName + " userName:" + userName);
return true;
} catch (Exception e) {
System.out.println("authenticate fail distinguishedName:" + distinguishedName + " userName:" + userName);
return false;
} finally {
closeContext(ctx);
}
} }

config.properties

# AD Validation#
ad.url=ldap://x.x.x.x:xxx
ad.base=DC=adservice,DC=com
ad.path.template=%s@adservice.com

单元测试:

ADAuthSpringTest.java

package com.hui.advalidationdemo;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext-ldap.xml" })
public class ADAuthSpringTest { @Autowired
public ADAuthSpring adValidation; @Test
public void testAuth() {
Assert.assertTrue(adValidation.authenticate("abc", "123abc."));
} }

ApplicationConstants.java

package com.hui.advalidationdemo.constant;

import static java.lang.String.format;
import static java.lang.Thread.currentThread;
import static org.apache.commons.lang3.StringUtils.isBlank; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import org.apache.log4j.Logger; public class ApplicationConstants { private static final String CONFIG_FILE = "config.properties";
private static Map<String, Object> configs = new HashMap<String, Object>(); private static final Logger log = Logger.getLogger(ApplicationConstants.class);
static {
InputStream in = null;
Properties p = new Properties();
try{
in = currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE);
p.load(in);
for(Object k : p.keySet()){
String key = (String) k;
configs.put( key, p.getProperty(key));
}
log.info("config.properties is loaded!" );
} catch (IOException e){
log.error("Unable to read config.properties");
} finally{
if(in != null)
try {
in.close();
} catch (IOException e) {
log.error("Unable to close inputstream");
}
}
} public static String getConfig(String key){
return (String) configs.get(key);
}
public static String buildADPath(String userName) {
String adPathTemplate = getConfig("ad.path.template");
if (isBlank(adPathTemplate)) {
log.error("ad.path template do not exist in config.properties please config it");
return null;
}
log.debug("ad.path template is "+adPathTemplate);
try {
String adPath = format(adPathTemplate, userName);
log.debug("adPath is:"+adPath);
return adPath;
} catch (Exception e) {
log.error("ad path template format error");
return null;
} } }

注意:在测试的时候需要将x.x.x.x,xxx,abc,123abc.替换成相应的域服务器ip,域服务器端口,域用户名,域用户密码

源码:https://github.com/GreyZeng/demo/tree/master/advalidation


更多:http://docs.spring.io/spring-ldap/docs/1.2.0/reference/

AD域登录验证的更多相关文章

  1. AD用户登录验证,遍历OU(LDAP)

    先安装python-ldap模块 1.验证AD用户登录是否成功 import sqlite3,ldap domainname='cmr\\' username='zhangsan' ldapuser ...

  2. ASP.NET Core AD 域登录

    在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能. 当然如果使用的是Azure ...

  3. ASP.NET Core AD 域登录 (转载)

    在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能. 当然如果使用的是Azure ...

  4. AD域账号验证

    public partial class _Default : Page { [DllImport("advapi32.dll")] private static extern b ...

  5. java集成微软的ad域,实现单点登录

    1.ad域介绍: windos server 2008R2服务器下的ad域,见下图(我是在虚拟机安装到windos server) 2.连接ad域代码:(里面代码自行修改) public Result ...

  6. JAVA 通过LDAP获取AD域用户及组织信息

    因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的A ...

  7. Linux AD 身份统一验证(SSO)

    http://www.toxingwang.com/linux-unix/linux-admin/584.html Linux+samba-winbind+AD实现统一认证 2013年04月27日 ⁄ ...

  8. Samba通过ad域进行认证并限制空间大小《转载》

    本文实现了samba服务被访问的时候通过windows域服务器进行用户名和密码验证;认证通过的用户可以自动分配500M的共享空间;在用户通过windows域登陆系统的时候可以自动把这块空间映射成一块硬 ...

  9. springboot整合微软的ad域,采用ldap的api来整合,实现用户登录验证、

    流程: 1.用户调登录接口,传用户名和密码2.用户名和密码在ad验证,验证通过后,返回当前用户的相关信息.(注:ldap为java自带的api不需要maven引入其他的)3.根据返回的用户信息,实现自 ...

随机推荐

  1. Ubuntu添加开机自动启动程序方法

    1. 开机启动时自动运行程序  Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置    文件继续引导过程,启动其它进程.通常情况下,修改放置在      / ...

  2. java线程学习

    线程概念 当我问别人什么是线程的时候,别人给我讲了一大堆线程如何创建,如何使用以及若干线程的高深问题,其实作为一个资深菜鸟,我就想问问,什么是线程而已,找了书中的一些概念总结了一下,多线程与操作系统中 ...

  3. Linux系统的理解及学习Linux内核的心得

    作业列表      (点击作业跳转) linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核 ...

  4. python的函数调用和参数传递

    不可变对象(immutable):int.string.float.number.tuple 可变对象(mutable):dict.list 对于基本数据类型的变量,变量传递给函数后,函数会在内存中复 ...

  5. Java Socket

    什么是Socket Socket的概念很简单,它是网络上运行的两个程序间双向通讯的一端,既可以接收请求,也可以发送请求,利用它可以较为方便地编写网络上数据的传递. 所以简而言之,Socket就是进程通 ...

  6. 多彩的Console打印新玩法

    Chrome应该是每一个Web开发者必备的工具之一.它有而强大的Devtool,辅助我们的JavaScript调试,审视DOM元素,CSS即时修改等.以及它还有一个的庞大的插件系统,同时我们也可以很容 ...

  7. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

    原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...

  8. spring快速入门(一)

    对于为什么使用spring框架,这里不多做解释,详情请百度.本人推荐面向驱动程序学习,通过实战来瞧瞧spring技术的伟大.所以先来看看原始开发一个简单的例子,由例子引入spring相关的技术.如果错 ...

  9. 【PRINCE2是什么】PRINCE2认证之七大原则(4)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第四个原则:按阶段管理. 阶段管理其实是给高层提供了项目生命周期中相对应的控 ...

  10. KnockoutJS 3.X API 第六章 组件(3) 组件绑定

    组件绑定将指定的组件注入到元素中,并且可选地将参数传递给它. 本节目录 一个例子 API 组件生命周期 备注1:仅限模板组件 备注2:使用没有容器元素的组件 备注3:将标记传递给组件 处置和内存管理 ...