`

spring使用ldap

 
阅读更多
为了读取公司域账号,使用上ldap接口,Java编码如下 ;
maven项目添加
<dependency>
			<groupId>org.springframework.ldap</groupId>
			<artifactId>spring-ldap-core</artifactId>
			<version>2.0.2.RELEASE</version>
		</dependency>

/**
 * 
 */
package com.howbuy.uaa.ldap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.ldap.core.AuthenticationSource;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource;

/**
 * @author qiankun.li
 * 
 */
public class UaaLdapTemplate {

	private LDAPAuthentication authentication;

	private static LdapTemplate template;
	
	private Map<String, List<User>> cacheMap = new HashMap<String, List<User>>();
	
	private final String USER_CACHE_KEY = "user_cache_key";

	/**
	 * ldap服务器URL
	 */
	private String url;
	/**
	 * baseDn
	 */
	private String baseDn;
	/**
	 * ldap服务器账号
	 */
	private String principal;
	/**
	 * ldap服务器密码
	 */
	private String credentials;

	void init() {
		LdapContextSource cs = new LdapContextSource();
		cs.setCacheEnvironmentProperties(false);
		cs.setUrl(url);
		cs.setBase(baseDn);
		cs.setAuthenticationSource(new AuthenticationSource() {
			@Override
			public String getCredentials() {
				return credentials;
			}

			@Override
			public String getPrincipal() {
				return principal;
			}
		});
		template = new LdapTemplate(cs);
	}

	/**获取所有的用户数据
	 * @param isFromCache 是否从本地缓存取数据 true/false
	 * @return
	 */
	public List<User> getAllUser(boolean isFromCache) {
		List<User> result = null;
		boolean isFromLocal = false;
		if(isFromCache){
			result = cacheMap.get(USER_CACHE_KEY);
			if(null==result){
				isFromLocal = true;
			}
		}else{
			isFromLocal = true;
		}
		if(isFromLocal){
			result = new ArrayList<User>();
			String baseCeo = "OU=CEO";
			String base_hk = "OU=staff-hk,OU=howbuy-hk";
			String base_pd = "OU=staff-pd,OU=howbuy-pd";
			List<User> ceo = template.search(baseCeo, "(objectclass=user)",
					new UserMapper());
			List<User> hk = template.search(base_hk, "(objectclass=user)",
					new UserMapper());
			List<User> pd = template.search(base_pd, "(objectclass=user)",
					new UserMapper());
			
			result.addAll(ceo);
			result.addAll(hk);
			result.addAll(pd);
			putUsersToCache(result);
		}
		return result;
	}

	private void putUsersToCache(List<User> result){
		cacheMap.put(USER_CACHE_KEY, result);
		System.out.println("put  key ["+USER_CACHE_KEY+"] value into localCache successed");
	}
	
	/**
	 * 判断用户是否合法,当用户名密码都正确的时候返回true,否则false
	 * @param UID
	 * @param password
	 * @return
	 */
	public boolean authenricate(String UID, String password) {
		return authentication.authenricate(UID, password);
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getBaseDn() {
		return baseDn;
	}

	public void setBaseDn(String baseDn) {
		this.baseDn = baseDn;
	}

	public String getPrincipal() {
		return principal;
	}

	public void setPrincipal(String principal) {
		this.principal = principal;
	}

	public String getCredentials() {
		return credentials;
	}

	public void setCredentials(String credentials) {
		this.credentials = credentials;
	}

	public LDAPAuthentication getAuthentication() {
		return authentication;
	}

	public void setAuthentication(LDAPAuthentication authentication) {
		this.authentication = authentication;
	}

}

如上是获取用户的代码,但是我想校验用户的用户名密码是否正确,经过网上查找资料,spring目前没有找到可以做到的方法,所有,还是使用原生的API,代码如下
package com.howbuy.uaa.ldap;

import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LDAPAuthentication {
	private static final Logger LOGGER = LoggerFactory
			.getLogger(LDAPAuthentication.class);

	private String url;
	private String baseDn;
	private String principal;
	private String credentials;
	private String factory = "com.sun.jndi.ldap.LdapCtxFactory";
	private LdapContext ctx = null;
	private final Control[] connCtls = null;

	private void LDAP_connect() throws Exception {
		if (null == ctx) {
			Hashtable<String, String> env = new Hashtable<String, String>();
			env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
			env.put(Context.PROVIDER_URL, url + baseDn);
			env.put(Context.SECURITY_AUTHENTICATION, "simple");

			env.put(Context.SECURITY_PRINCIPAL, principal);
			env.put(Context.SECURITY_CREDENTIALS, credentials);
			// 此处若不指定用户名和密码,则自动转换为匿名登录
			try {
				ctx = new InitialLdapContext(env, connCtls);
			} catch (javax.naming.AuthenticationException e) {
				throw e;
			} catch (Exception e) {
				throw e;
			}
		}
	}

	private String getUserDN(String uid) throws Exception {
		String userDN = "";
		LDAP_connect();
		try {
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			NamingEnumeration<SearchResult> en = ctx.search("","sAMAccountName=" + uid, constraints);
			if (en == null || !en.hasMoreElements()) {
				LOGGER.warn("未找到用户:" + uid);
				return userDN;
			}
			// maybe more than one element
			while (en != null && en.hasMoreElements()) {
				Object obj = en.nextElement();
				if (obj instanceof SearchResult) {
					SearchResult si = (SearchResult) obj;
					userDN += si.getName();
					userDN += "," + baseDn;
				}
			}
		} catch (Exception e) {
			LOGGER.error("查找用户[" + uid + "]时产生异常", e.getMessage());
		}
		return userDN;
	}

	public boolean authenricate(String UID, String password) {
		boolean valide = false;
		String userDN = "";
		try {
			userDN = getUserDN(UID);
			if(StringUtils.isNotBlank(userDN)){
				LOGGER.info("userDN:" + userDN);
				ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
				ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
				ctx.reconnect(connCtls);
				LOGGER.info(userDN + ",验证通过");
				valide = true;
			}
		} catch (AuthenticationException e) {
			LOGGER.info(userDN + ",验证失败", e.getMessage());
			valide = false;
		} catch (NamingException e) {
			LOGGER.info(userDN + ",验证失败", e.getMessage());
			valide = false;
		} catch (Exception e) {
			LOGGER.info(userDN + ",验证失败", e.getMessage());
		}
		
		try {
			ctx.close();
		} catch (NamingException e) {
			LOGGER.info("关闭LdapContext对象失败", e.getMessage());
		}finally{
			if(null!=ctx){
				ctx=null;
			}
		}
		
		return valide;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getBaseDn() {
		return baseDn;
	}

	public void setBaseDn(String baseDn) {
		this.baseDn = baseDn;
	}

	public String getPrincipal() {
		return principal;
	}

	public void setPrincipal(String principal) {
		this.principal = principal;
	}

	public String getCredentials() {
		return credentials;
	}

	public void setCredentials(String credentials) {
		this.credentials = credentials;
	}

}
package com.howbuy.uaa.ldap;

import java.util.List;

import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;

import org.springframework.ldap.core.AttributesMapper;

public class UserMapper implements AttributesMapper<User> {

	@Override
	public User mapFromAttributes(Attributes attributes) throws NamingException {

		User user = new User();
		Attribute attributeCn = attributes.get("cn");
		if (null != attributeCn) {
			user.setUserName(attributeCn.get().toString());
		}
		Attribute attributeAcc = attributes.get("sAMAccountName");
		if (null != attributeAcc) {
			user.setAccount(attributeAcc.get().toString());
		}
		Attribute attributeMail = attributes.get("mail");
		if (null != attributeMail) {
			user.setEmail(attributeMail.get().toString());
		}
		Attribute attributeUid = attributes.get("member");
		if (null != attributeUid) {
			int size = attributeUid.size();
			List<String> memberList = user.getMemberList();
			for (int i = 0; i < size; i++) {
				String ms = attributeUid.get(i).toString();
				memberList.add(ms);
			}
		}
		
		Attribute attributeDistinguishedName = attributes.get("distinguishedName");
		if(null!=attributeDistinguishedName){
			user.setDistinguishedName(attributeDistinguishedName.get().toString());
		}else{
			return null;
		}
		return user;
	}

}
/**
 * 
 */
package com.howbuy.uaa.ldap;

import java.util.ArrayList;
import java.util.List;

/**
 * @author qiankun.li
 * 
 */
public class User {

	/**
	 * 域账号
	 */
	private String account;
	
	/**
	 * 中文名称
	 */
	private String userName;
	
	/**
	 * email
	 */
	private String email;
	
	/**
	 * 详细Dn
	 */
	private String distinguishedName;

	private List<String> memberList = new ArrayList<String>(0);

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public List<String> getMemberList() {
		return memberList;
	}

	public void setMemberList(List<String> memberList) {
		this.memberList = memberList;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

	public String getDistinguishedName() {
		return distinguishedName;
	}

	public void setDistinguishedName(String distinguishedName) {
		this.distinguishedName = distinguishedName;
	}

}
结合起来使用,ok,
附件是spring-ldap-reference.pdf文档,可以再详细研究
分享到:
评论

相关推荐

    Spring LDAP 简单使用

    在开始使用Spring LDAP之前,你需要在项目中添加相关的依赖。如果你使用的是Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.springframework.ldap &lt;artifactId&gt;spring-ldap-core 版本号 ``` 请...

    Spring LDAP API(Spring LDAP 开发文档).CHM

    Spring LDAP。 官网 Spring LDAP API。 Spring LDAP 开发文档。

    Spring Data LDAP API(Spring Data LDAP 开发文档).CHM

    Spring Data LDAP API。 Spring Data LDAP 开发文档。 官网 Spring Data LDAP API。

    spring-Ldap

    Spring-Ldap 是一个基于 Spring 框架的 LDAP(轻量级目录访问协议)开发工具包,它为在 Java 应用中使用 LDAP 提供了强大的支持。这个项目是为了简化 LDAP 数据的集成,提供了一种与 Spring 框架无缝集成的方式,...

    spring-ldap1.3.1

    Spring LDAP 是一个强大的...总之,Spring LDAP 1.3.1为Java开发者提供了一种高效且易于使用的工具,以处理与LDAP服务器的交互。通过它的强大功能,开发者可以更加专注于业务逻辑,而无需深入了解复杂的LDAP协议细节。

    spring-ldap-core-1.3.0.RELEASE.jar

    spring-ldap-core-1.3.0.RELEASE.jar

    Spring Boot中使用LDAP来统一管理用户信息的示例

    Spring Boot 中使用 LDAP 统一管理用户信息的示例 本篇文章主要介绍了 Spring Boot 中使用 LDAP 来统一管理用户信息的示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。下面我们将详细介绍 LDAP 的基础...

    Spring+LDAP实现单点登录

    Spring框架与LDAP(轻量级目录访问协议)的结合使用,可以实现高效的单点登录(Single Sign-On,简称SSO)系统。SSO允许用户在多个应用系统中只需要登录一次,即可访问所有相互信任的应用系统,提高了用户体验并简化...

    Spring Security ldap 1.3.2

    Spring Security LDAP不仅可以与Spring MVC或Spring Boot集成,还可以与Spring Data LDAP一起使用,简化对LDAP数据的CRUD操作。此外,它可以与其他身份验证机制(如数据库认证)结合,提供多因素认证。 **7. 性能...

    spring_ldap

    为了更好地理解如何在实际项目中使用 Spring LDAP,这里提供了一个完整的 `PersonDao` 类示例,该类展示了如何使用 Spring LDAP 进行搜索、查找、绑定和修改等操作。 #### 扩展 API 方法 Spring LDAP 还允许开发者...

    spring-ldap demo

    本示例项目 "spring-ldap demo" 提供了一个关于如何使用 Spring LDAP 进行实际操作的详细教程,包括与 LDAP 目录的增删查改操作,并结合了 EXT.js 进行前端展示。 首先,我们来了解一下 Spring LDAP 的核心概念。...

    对LDAP的基本操作(Spring-ldap)+Ext实现显示LDAP的树状结构

    rar包:一个Web工程, 主要有,利用Spring-ldap对LDAP的基本操作(查询,增删改);Extjs实现的对Ldap的树状结构的显示,结构有点类似Softerra LDAP;一个测试类。 pdf:spring-ldap-reference.pdf Extjs.pdf ...

    [Spring] Spring LDAP 实践开发 (英文版)

    Practical Spring LDAP is your guide to developing Java-based enterprise applications using the Spring LDAP Framework. This book explains the purpose and fundamental concepts of LDAP before giving a ...

    spring boot集成ldap

    在Spring Boot项目中,我们可以使用`spring-boot-starter-ldap`和`spring-boot-starter-data-ldap`这两个starter来引入LDAP支持。在`pom.xml`或`build.gradle`文件中添加如下依赖: ```xml &lt;groupId&gt;org.spring...

    spring-ldap-1.2.jar

    spring-ldap-1.2.jar jar包

    spring ldap 1.3.0下载

    在本文中,我们将深入探讨Spring LDAP 1.3.0版本,包括它的特点、用途、安装过程以及如何在实际项目中使用它。 **Spring LDAP 1.3.0概述** Spring LDAP 是Spring框架的一个扩展,它将Spring的数据抽象概念应用于...

    spring ldap的使用

    标题与描述中的关键词“spring ldap的使用”指向的是在Spring框架下集成轻量级目录访问协议(Lightweight Directory Access Protocol,简称LDAP)的相关知识。Spring LDAP是Spring框架的一部分,它提供了一种简单的...

    spring-security-ldap-2.0.1

    《Spring Security LDAP 2.0.1:深度解析与实战指南》 在Java企业级开发中,Spring Security作为一款强大的安全框架,为应用程序提供了全面的安全管理解决方案。而其与LDAP(Lightweight Directory Access Protocol...

    使用 Spring LDAP 读取数据并映射到 Java Bean 中

    这篇博客文章“使用 Spring LDAP 读取数据并映射到 Java Bean 中”主要探讨了如何通过Spring LDAP来查询LDAP目录信息,并将查询结果转换为Java对象,以便在应用程序中进一步处理。 首先,`pom.xml`文件是Maven项目...

    spring_ldap1.3_api

    spring_ldap1.3的chm格式api

Global site tag (gtag.js) - Google Analytics