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文档,可以再详细研究
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值