- 浏览: 285881 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
86614009:
如何在service层,如何获取绑定到当前线程的entitna ...
使用spring的OpenEntityManagerInView -
yajunyajun2011:
好帖子 怎么没人顶呢
Java 正则表达式最大,最小匹配问题 -
xtuali:
能说明一下,你的nutch是哪个版本的吗?谢谢!
搜索引擎Nutch源代码研究之一 网页抓取(1) -
dongmusic:
需要学习这么多的东西,吐血中...
如何提高Java开发能力 -
jiminsc:
cool
LDAP 验证、添加、修改、删除(转)
LDAP 验证、添加、修改、删除(转)
1. 域服务器(dc=dctest,dc=com),安装证书服务,创建企业根证书,名称为dctest.com
则:cn=dctest.com,dc=dctest,dc=com
2. 申请证书类型域控制器的证书
3. 将企业根证书和域控制器证书导入到应用服务器cacerts
4. 在应用程序中,编写代码引用cacerts认证。
keytool
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- package bof.usermanager.auth.impl;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Properties;
- import javax.naming.AuthenticationException;
- import javax.naming.Context;
- import javax.naming.NamingEnumeration;
- import javax.naming.NamingException;
- import javax.naming.directory.Attribute;
- import javax.naming.directory.Attributes;
- import javax.naming.directory.BasicAttribute;
- import javax.naming.directory.BasicAttributes;
- import javax.naming.directory.DirContext;
- import javax.naming.directory.ModificationItem;
- 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 com.report.service.PropertyItem;
- import com.report.vo.OrganizationalUnitDomain;
- import com.report.vo.UserDomain;
- /**
- * 功能:本操作类提供AD域用户的增、删、查、改功能
- * 作者:陈艺武
- * 日期:2010-4-13
- */
- public class LdapADManager {
- protected DataSourceConnectLDAPVO transientInstance = null ;
- /** 用户的objectClass*/
- private String default_objectclass = "user" ;
- /**用户的默认根DN*/
- private String default_base = "CN=Users,DC=all,DC=com" ;
- /** 用户默认主键*/
- private String key_index = "CN" ;
- /** 用户默认密码属性.*/
- private String pwd_index = "unicodePwd" ;
- private Control[] connCtls = null ;
- private static LdapADManager LdapADManager = null ;
- private LdapADManager(){}
- public static LdapADManager getInstance(){
- if (LdapADManager== null )
- LdapADManager = new LdapADManager();
- return LdapADManager;
- }
- /**
- * 从连接池中获取一个连接.
- *
- * @return LdapContext
- * @throws NamingException
- */
- public LdapContext getConnectionFromFool() throws NamingException {
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- String keystore = "c:/Java/jdk1.6.0_10/jre/lib/security/cacerts" ;
- System.setProperty("javax.net.ssl.trustStore" , keystore);
- Properties env = new Properties();
- env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory" );
- env.put("com.sun.jndi.ldap.connect.pool" , "true" );
- env.put(Context.SECURITY_AUTHENTICATION, "simple" );
- env.put(Context.SECURITY_PROTOCOL, "ssl" );
- //env.put("java.naming.referral", "follow");
- env.put(Context.PROVIDER_URL, ldapProperty.getLdapURL());
- connCtls = new Control[] { new LdapADManagerControl() };
- return new InitialLdapContext(env, connCtls);
- }
- /**
- * 功能:校验用户登录.
- * @param userName
- * @param password
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 13, 2010
- */
- public boolean authenticate(String userName, String password) {
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- String userDn = userName + "@" + ldapProperty.getDomain();
- LdapContext ctx = null ;
- try {
- ctx = getConnectionFromFool();
- ctx.getRequestControls();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDn);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
- ctx.reconnect(connCtls);
- return true ;
- } catch (AuthenticationException e) {
- e.printStackTrace();
- return false ;
- } catch (NamingException e) {
- e.printStackTrace();
- return false ;
- } finally {
- try {
- ctx.close();
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- }
- /**
- * 功能:获取AD用户列表
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 12, 2010
- */
- public List listUser(){
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- List list = new ArrayList();
- LdapContext ctx = null ;
- UserDomain user=null ;
- String base = "OU=" + ldapProperty.getBase() + "," + ldapProperty.getDomainDC();
- try {
- ctx = this .getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, ldapProperty.getUserName() + "@" + ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, ldapProperty.getPassWord());
- //base = "OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
- String filter = "(&(objectCategory=person)(objectClass=USER)(name=*))" ;
- SearchControls controls = new SearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- //controls.setReturningAttributes(new String[] {"sAMAccountName", "displayName", "department"});
- controls.setReturningAttributes(new String[] { "sAMAccountName" , "cn" });
- NamingEnumeration<SearchResult> answer = ctx.search(base, filter, controls);
- while (answer.hasMore()) {
- user=new UserDomain();
- SearchResult result = answer.next();
- NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
- int count= 0 ;
- while (attrs.hasMore()) {
- Attribute attr = attrs.next();
- if (count== 0 ){
- user.setUserName(attr.get().toString());
- }else {
- user.setUserAliasName(attr.get().toString());
- }
- count++;
- }
- user.setNameSpace(ldapProperty.getDomain());
- list.add(user);
- }
- }catch (Exception e){
- e.printStackTrace();
- } finally {
- try {
- ctx.close();
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- return list;
- }
- /**
- * 功能:查询组织单位列表
- * @param ouName
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 13, 2010
- * 说明:base格式如:"OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
- */
- public List listOrganizztionalUnit(String ouName){
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- List list = new ArrayList();
- LdapContext ctx = null ;
- OrganizationalUnitDomain ouDomain = null ;
- String base = "OU=" + ldapProperty.getBase() + "," + ldapProperty.getDomainDC();
- try {
- ctx = this .getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, ldapProperty.getUserName() + "@" + ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, ldapProperty.getPassWord());
- String filter = "(&(objectClass=organizationalUnit)" ;
- if (ouName!= null &&!ouName.equals( "" ))
- filter = filter + "(name=*" + ouName + "*)" ;
- filter = filter + ")" ;
- SearchControls controls = new SearchControls();
- controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
- controls.setReturningAttributes(new String[] { "name" });
- NamingEnumeration<SearchResult> answer = ctx.search(base, filter, controls);
- while (answer.hasMore()) {
- ouDomain = new OrganizationalUnitDomain();
- SearchResult result = answer.next();
- NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
- int count= 0 ;
- while (attrs.hasMore()) {
- Attribute attr = attrs.next();
- if (count== 0 ){
- ouDomain.setOuName(attr.get().toString());
- }
- count++;
- }
- list.add(ouDomain);
- }
- }catch (Exception e){
- e.printStackTrace();
- } finally {
- try {
- ctx.close();
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- return list;
- }
- /**
- * 功能:添加用户
- * @param ou 组织单位:中投证券,销售部门
- * @param department
- * @param realName 真实姓名,如:李伟
- * @param userName 用户名,如:administrator
- * @param userPwd
- * @param adminUser
- * @param adminPwd
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 12, 2010
- */
- public boolean addUser(String ou,String department,String realName, String userName, String adminUser,String adminPwd) {
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- LdapContext ctx = null ;
- try {
- ctx = getConnectionFromFool();
- Attributes attrs = new BasicAttributes( true );
- Attribute objclass = new BasicAttribute( "objectclass" );
- setObjectclassToAttribute(objclass);
- attrs.put(objclass);
- attrs.put("sAMAccountName" , userName);
- attrs.put("cn" , realName);
- int UF_ACCOUNTDISABLE = 0x0002 ;
- int UF_PASSWD_NOTREQD = 0x0020 ;
- int UF_NORMAL_ACCOUNT = 0x0200 ;
- int UF_PASSWORD_EXPIRED = 0x800000 ;
- attrs.put("userAccountControl" , Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWD_NOTREQD + UF_PASSWORD_EXPIRED + UF_ACCOUNTDISABLE));
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser + "@" + ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);
- //String newUser = "CN="+realName+"," + cvtOuString(ou) + "," + ldapProperty.getDomainDC();
- String newUser = "CN=" +realName+ "," + this .getFullOu(ctx, ou) + "," + ldapProperty.getDomainDC();
- ctx.createSubcontext(newUser, attrs);
- ModificationItem[] mods = new ModificationItem[ 2 ];
- String newQuotedPassword = "\"" + userName + "\"" ;
- byte [] newUnicodePassword = newQuotedPassword.getBytes( "UTF-16LE" );
- mods[0 ] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute( "unicodePwd" , newUnicodePassword));
- mods[1 ] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute( "userAccountControl" , Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWORD_EXPIRED)));
- ctx.modifyAttributes(newUser, mods);
- mods = null ;
- return true ;
- } catch (NamingException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- if (ctx != null ){
- try {
- ctx.close();
- }catch (NamingException e){
- e.printStackTrace();
- }
- ctx = null ;
- }
- }
- return false ;
- }
- /**
- * 功能:管理员用户初始化用户密码
- * @param sUserName
- * @param sNewPassword
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 13, 2010
- */
- public boolean adminChangePassword(String adminUser,String adminPwd,String sUserName){
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- LdapContext ctx = null ;
- //不能从应用中修改超级管理员密码
- if (sUserName!= null &&sUserName.equalsIgnoreCase( "administrator" ))
- return false ;
- try {
- ctx = getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser + "@" + ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);
- ModificationItem[] mods = new ModificationItem[ 1 ];
- String newQuotedPassword = "\"" + sUserName + "\"" ;
- byte [] newUnicodePassword = newQuotedPassword.getBytes( "UTF-16LE" );
- mods[0 ] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute( "unicodePwd" , newUnicodePassword));
- String cnUser = getUser(ctx,sUserName) + "," + ldapProperty.getDomainDC();
- ctx.modifyAttributes(cnUser, mods);
- return true ;
- }catch (Exception e){
- e.printStackTrace();
- } finally {
- try {
- ctx.close();
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- return false ;
- }
- /**
- * 功能:用户修改密码
- * @param sUserName
- * @param sOldPassword
- * @param sNewPassword
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 9, 2010
- */
- public boolean userChangePassword(String sUserName, String sOldPassword, String sNewPassword){
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- LdapContext ctx = null ;
- String userNameAndDomain = sUserName + "@" + ldapProperty.getDomain();
- //不能从应用中修改超级管理员密码
- if (sUserName!= null &&sUserName.equalsIgnoreCase( "administrator" ))
- return false ;
- try {
- ctx = getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userNameAndDomain);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, sOldPassword);
- ModificationItem[] mods = new ModificationItem[ 2 ];
- String oldQuotedPassword = "\"" + sOldPassword + "\"" ;
- byte [] oldUnicodePassword = oldQuotedPassword.getBytes( "UTF-16LE" );
- String newQuotedPassword = "\"" + sNewPassword + "\"" ;
- byte [] newUnicodePassword = newQuotedPassword.getBytes( "UTF-16LE" );
- mods[0 ] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute( "unicodePwd" , oldUnicodePassword));
- mods[1 ] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute( "unicodePwd" , newUnicodePassword));
- String cnUser = getUser(ctx,sUserName) + "," + ldapProperty.getDomainDC();
- ctx.modifyAttributes(cnUser, mods);
- return true ;
- }catch ( Exception e){
- e.printStackTrace();
- }finally {
- try {
- ctx.close();
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- return false ;
- }
- /**
- * 功能:修改用户信息
- * @param attrs
- * @param userDN
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 12, 2010
- */
- public boolean modify(Attributes attrs, String userDN) {
- LdapContext ctx = null ;
- try {
- ctx = getConnectionFromFool();
- attrs.remove(key_index);
- ctx.modifyAttributes(userDN, DirContext.REPLACE_ATTRIBUTE, attrs);
- return true ;
- } catch (NamingException e) {
- System.err.println("Problem changing password: " + e);
- } catch (Exception e) {
- System.err.println("Problem: " + e);
- } finally {
- try {
- ctx.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return false ;
- }
- /**
- * 功能:删除用户
- * @param adminUser
- * @param adminPwd
- * @param userDN 用户登陆名
- * @return
- *
- * 作者:陈艺武
- * 日期:Apr 12, 2010
- */
- public boolean del(String adminUser,String adminPwd,String userName) {
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- LdapContext ctx = null ;
- try {
- ctx = getConnectionFromFool();
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, adminUser + "@" + ldapProperty.getDomain());
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, adminPwd);
- String adUser = getUser(ctx,userName) + "," + ldapProperty.getDomainDC();
- ctx.destroySubcontext(adUser);
- return true ;
- } catch (NamingException e) {
- System.err.println("Problem changing password: " + e);
- } catch (Exception e) {
- System.err.println("Problem: " + e);
- } finally {
- try {
- ctx.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return false ;
- }
- private void setObjectclassToAttribute(Attribute objclass){
- objclass.add("top" );
- objclass.add("person" );
- objclass.add("organizationalPerson" );
- objclass.add("inetorgperson" );
- }
- private String getUser(LdapContext ctx,String usr){
- String userName = "" ;
- String filter = "sAMAccountName=" +usr;
- SearchResult si = getSearchResult(ctx,filter);
- if (si!= null )
- userName = si.getName();
- return userName;
- }
- private String getFullOu(LdapContext ctx,String ou){
- String userName = "" ;
- String filter = "(&(objectClass=organizationalUnit)(name=" + ou + "))" ;
- SearchResult si = getSearchResult(ctx,filter);
- if (si!= null )
- userName = si.getName();
- return userName;
- }
- private SearchResult getSearchResult(LdapContext ctx,String filter){
- SearchResult si = null ;
- PropertyItem ldapProperty = (PropertyItem)AdProperties.getInstance().getPropertyItem().get(0 );
- try {
- SearchControls constraints = new SearchControls();
- co<mce:script type="text/javascript" src= "http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src= "http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" ></mce:script><mce:script type= "text/javascript" src= "http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src= "http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" ></mce:script>nstraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
- NamingEnumeration en = ctx.search(ldapProperty.getDomainDC(), filter , constraints); // 查询所有用户
- while (en!= null &&en.hasMoreElements()){
- Object obj = en.nextElement();
- if (obj instanceof SearchResult) {
- si = (SearchResult)obj;
- break ;
- }
- }
- }catch (NamingException ex) {
- ex.printStackTrace();
- }
- return si;
- }
- }
- class LdapADManagerControl implements Control {
- public byte [] getEncodedValue() {
- return null ;
- }
- public String getID() {
- return "1.2.840.113556.1.4.1781" ;
- }
- public boolean isCritical() {
-
return
true
<s
发表评论
相关推荐
Java 连接和验证 LDAP 文档 Java 连接和验证 LDAP 文档是一份关于 Java 语言连接和验证 LDAP 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...
5. **多种操作**:支持连接到多个LDAP服务器,可以浏览、搜索、添加、编辑和删除条目,同时提供过滤器功能,帮助精准定位所需信息。 6. **安全连接**:LdapAdmin支持SSL/TLS加密,确保在传输敏感数据时的数据安全。 ...
`python-ldap`是一个纯Python模块,它实现了LDAPv3协议,支持搜索、绑定、修改、添加、删除等操作。在Python中使用`python-ldap`,首先需要安装相应的库,如压缩包中的`python-ldap-2.4.4.win32-py2.6.msi`等文件,...
1. **用户管理**:通过LdapBrowser,IT管理员可以快速创建、修改和删除用户账户,分配权限,实现集中化的用户身份管理。 2. **组策略管理**:可以定义和应用组策略,控制用户的访问权限和系统设置。 3. **系统集成**...
LDAP操作主要包括bind(绑定)、search(搜索)、compare(比较)、delete(删除)、modify(修改)、add(添加)等。 **3. Java环境下的LDAP浏览器** 由于"LDAP Browser"是基于Java开发的,因此使用前需要确保...
2. **编辑操作**:支持创建、修改和删除LDAP条目,以及导入和导出数据。 3. **安全连接**:支持SSL/TLS加密,确保数据传输的安全性。 4. **过滤器支持**:允许使用标准的LDAP过滤语法进行复杂查询。 5. **属性编辑**...
在Spring LDAP中,我们通常会使用`LdapTemplate`来进行数据的添加。首先,需要创建一个`LdapEntry`对象,包含要插入的属性和值。然后调用`LdapTemplate`的`add()`方法,传入DN(Distinguished Name)和`LdapEntry`。...
6. **浏览与操作**:现在你可以自由地浏览目录结构,搜索条目,进行添加、修改和删除操作。 ### 实际应用 - **系统管理员**:通过LdapBrowser282进行用户管理,例如添加新用户、调整权限、同步用户信息等。 - **...
类库通常包含了各种预定义的方法和函数,用于执行常见的LDAP操作,如搜索、添加、删除、修改条目,以及绑定和解绑到LDAP服务器。 ### 类库的核心功能 1. **连接与身份验证**:类库提供了连接到 LDAP 服务器的方法...
在"spring-ldap1.3.1"版本中,这个框架提供了一个灵活且直观的API,允许开发者轻松地执行对LDAP目录的查询、添加、删除和更新操作。 1. LDAP简介: LDAP是一种应用层协议,主要用于存储和检索分布式身份信息。它...
4. **编辑与管理**:用户可以添加、修改或删除LDAP条目,以及它们的属性和值。 5. **导入与导出**:方便地将目录数据导入或导出到文件,便于备份和迁移。 6. **日志记录与审计**:记录所有操作,以供审核和故障...
本文通过一个具体的C语言代码示例来演示如何实现与LDAP服务器的连接、查询、修改、添加和删除等基本操作。 #### 二、LDAP基础知识 在深入了解示例代码之前,我们先简要介绍一些LDAP的基础概念: 1. **DN ...
LDAP 功能模型定义了LDAP 目录中的操作,例如检索、添加、修改和删除操作。LDAP 功能模型还包括LDAP 服务器的配置和管理功能。 1.2.4 LDAP 安全模型 LDAP 安全模型定义了LDAP 目录中的安全机制,例如身份验证、...
此外,你还可以进行更复杂的操作,如修改、添加或删除LDAP条目,这通常涉及到`ModifyRequest`、`AddRequest`和`DeleteRequest`等方法。 在实际应用中,为了提高安全性,通常会使用匿名绑定或基于证书的身份验证。...
4. **修改与删除**:可以对 LDAP 目录中的条目进行添加、修改和删除操作,方便测试数据变更流程。 5. **日志记录**:提供详细的日志输出,便于分析测试结果和调试问题。 6. **自定义脚本**:可能支持通过编写简单的...
在IBM LDAP中,Directory System Agent (DSA) 是核心组件,它负责处理客户端的请求,如搜索、添加、删除和修改条目。DSA通常与数据库结合,提供高性能的读写操作。此外,IBM LDAP支持多种安全机制,包括SSL/TLS加密...
通过 LDAP 查询,你可以搜索、添加、修改和删除这些条目。 在Spring MVC中集成LDAP,我们主要涉及以下几个步骤: 1. **配置LDAP连接**:首先,我们需要配置一个`LdapContextSource`对象,提供连接到LDAP服务器的...
它支持多种LDAP操作,如搜索、添加、删除和修改条目。通过这个模块,开发人员可以轻松地将应用程序的用户认证过程与LDAP服务器对接,实现用户登录验证。 **2. LDAP认证流程** Spring Security LDAP的认证流程通常...
3. **LDAP操作**:包括搜索(Search)、添加(Add)、删除(Delete)、修改(Modify)、比较(Compare)和绑定(Bind)等。 **二、LDAP浏览器功能** 1. **可视化浏览**:提供树形视图展示目录结构,便于理解并导航...