AD域实现统一用户管理

    1. AD域服务

    什么是目录(directory)呢?

日常生活中使用的电话薄内记录着亲朋好友的姓名、电话与地址等数据,它就是 telephone directory(电话目录);计算机中的文件系统(file system)内记录着文件的文件名、大小与日期等数据,它就是 file directory(文件目录)。

如果这些目录内的数据能够由系统加以整理,用户就能够容易且迅速地查找到所需的数据,而 directory service(目录服务)提供的服务,就是要达到此目的。在现实生活中,查号台也是一种目录;在 Internet 上,百度和谷歌提供的搜索功能也是一种目录服务。

Active Directory 域内的 directory database(目录数据库)被用来存储用户账户、计算机账户、打印机和共享文件夹等对象,而提供目录服务的组件就是 Active Directory (活动目录)域服务(Active Directory Domain Service,AD DS),它负责目录数据库的存储、添加、删除、修改与查询等操作。一般适用于一个局域网内。

在 AD 域服务(AD DS)内,AD 就是一个命名空间(Namespace)。利用 AD,我们可以通过对象名称来找到与这个对象有关的所有信息。

在 TCP/IP 网络环境内利用 Domain Name System(DNS)来解析主机名与 IP 地址的对应关系,也就是利用 DNS 来解析来得到主机的 IP 地址。除此之外,AD 域服务也与 DNS 紧密结合在一起,它的域命名空间也是采用 DNS 架构,因此域名采用 DNS 格式来命名,例如可以将 AD 域的域名命名为 moonxy.com。

 

    1. LDAP简介

LDAP(Lightweight Directory Access Protocol),轻量目录访问协议,是一种用来查询与更新 Active Directory 的目录服务通信协议。AD 域服务利用 LDAP 命名路径(LDAP naming path)来表示对象在 AD 内的位置,以便用它来访问 AD 内的对象。

         LDAP数据的组织方式(如下图所示), 在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (Organization)(o=Acme)或组织单元(Organizational units) (ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有设备等信息。此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetOrgPerson对象类需要支持sn(surname)和cn(common name)属性,但也可以包含可选的如邮件,电话号码等属性。

 

1.2 LDAP常见简称

简介

全称

用途

o

Organization

组织/公司

ou

Organization Unit

组织单元

c

Country

国家

dc

Domain Component

域名

sn

Suer Name

真实名称

cn

Common Name

常用名称

dn

Distiguished Name

唯一标识名

uid

User ID

用户标识

 

1.3 AD域与LDAP的区别

Windows AD(Active Directory)域应该是LDAP的一个应用实例,而不应该是LDAP本身。Windows AD域的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,AD域提供了相关的用户接口,我们可以把AD域当做微软定制的LDAP服务器。Active Directory先实现一个LDAP服务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用。

2创建AD域服务,导入证书

创建AD域服务这里不在多说,网上有很多详细教程。详细介绍一下AD域服务证书问题。

情况1:不涉及密码,状态操作。不需要证书

可以使用默认389端口 使用springboot 集成LDAP配置 就可以完成基本操作

情况 2:功能要求密码,状态操作

   这种情况下需要使用AD域的636端口,SSL协议访问,并导入服务器的AD域服务证书  。 网上有很多教程说本地使用ie浏览器访问服务器IP,下载证书,亲测没什么用还增加难度。可以使用最简单的方式 服务器导出证书后直接复制到本地。

证书导入: 默认密码 changeit

开始 >> 运行 >> 输入cmd 进入dos命令行 >>cd 到jdk1.5\jre\lib\security这个目录下,敲以下命令(使用此命令可以省略指定路径):

keytool -import -alias cacerts -keystore cacerts -file d:\software\AKAZAM-Mail.cer

红底 : 为证书导入起的别名,可以随便起

绿底 : 为从服务器导出的证书路径(命令错误就给路径加上双引号 “”)

       如果在连接的代码中报错误

       javax.naming.CommunicationException: 192.168.0.10:636 [Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names matching IP address 192.168.0.10 found]

       换JDK 1.8-161 或 尝试属于下列导入证书方式(该步骤需写路径):

1. 然后“开始-运行->cmd”进入控制台,

2. 用CD命令切换到jdk的bin目录下,

3. 输入命令:“keytool -import -keystore 证书名.keystore  -file cer文件的路径”,

4. 从而导入一个新的证书,进入jdk的bin目录能够看到你新命名的那个扩展名为keystore的文件,

5. 然后将更改密码的时候设置的证书路径更改为刚刚生成的这个证书的文件路径。(代码中体现)

3连接AD域服务

使用Softera LDAP Browser连接服务 方便查看AD域用户信息

  1. 创建连接

 

 

  1. 输入连接名(随便输入)

 

  1. 输入IP地址 点击FetchBaseDNs选择域名(默认389端口)

 

  1. 输入用户名+@域名

这里Principal 一定记得输入 用户名+@完整域名

 

  1. 连接完成

       从图一中可以查看AD域的组织和用户数据,图一红框中就是组织单元。但是AD域中也有组的概念,切记第一点,用户需要创建到组织单元中,然后可以根据用户角色分配到组里。

       第二点,图二是用户nie 的ObjectClass属性值。图三是组织单元的ObjectClass属性值

包括其他的 组,联系人,计算机。。。都有对应的ObjectClass值。在创建,查找,删除,修改用户,组织单元等 都需要指定objectClass(在下面代码中详细介绍)

 

4. 集成LDAP配置

     在pom.xml中添加Maven依赖

<!-- LDAP Module -->

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-ldap</artifactId>

</dependency>

<!-- JPA Module -->

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

项目依赖包spring-boot-starter-data-ldap是Spring Boot封装的对LDAP自动化配置的实现,它是基于spring-data-ldap来对LDAP服务端进行具体操作的

5 编写代码

先贴一下基本属性 第30行 使用636端口

5.1 打开链接

(197)该ip需 636端口

(198)在上述导入证书步骤中,如使用第一种可省略此步代码,使用第二种方式必须指定 .keystore文件的路径,

(200)在创建用户时需要设置密码和用户状态,所以需要指定SSL协议

此步骤如果用户验证失败,直接抛出异常 err code 49 可以先尝试把用户名加 @域名,如果还是err code 49 那就是你账号密码有问题

 

          5.2关闭连接

直接调用dc.close()方法即可

 

5.3添加账户

这里创建账户调用使用

public DirContext createSubcontext(String name, Attributes attrs)

       参数name 为创建用户的完整distinguishedName  CN= , OU= ,DC= ,DC= 形式

       Attrs 则为用户属性(见下图)

 

这里有个异常

Remain name 。。。的错,此错误为 distinguishedName  属性值错误

方法通过及添加完成

5.4设置添加属性

上图红框 :设置添加的属性。 此处4个属性值 对应用户。 也可更改为组,计算机等 可以在步骤三 最后图二中查看属性值。

 

上图绿框 :(170)设置用户常用名CN 基本属性之一

                (171)用户状态:66048[普通帐户,无密码到期]

                                             546 用户禁用    (还有很多其他状态自行百度)

                (174)编码格式不可改其他的,“\” 密码 “\”  \不可省略

                 (170 - 175) 这里的attrs 可以添加更多的数据,例如姓,电话,公司,职位等等,只需要put方法第一个参数设置成对应的属性,可在3连接AD域服务 软件上查看

这里有一点 cn 要和 distinguishedName 中的CN= 一致

                                                                            

 

 

 

 

 

 

 

 

 

 

 

 

 

在学习操作AD域中 , 难点就在于导入服务器证书,以ssl协议连接,并创建用户设置密码,设置状态。至于其他的操作,直接调用 LdapContext 的方法及可实现难度不大。

6 参考文章

Windows Server 2008 R2 活动目录服务安装  链接

安装AD域服务证书 win server 2008  链接   证书导入参考 本文档步骤2

安装AD域服务证书 win server 2012  链接   证书导入参考 本文档步骤2

Spring LDAP Reference  官方文档    链接 

博客  链接

操作AD域  err code 总计

 

 

展开阅读全文

没有更多推荐了,返回首页