当前位置:首页 > 其他范文 > 观后感 > 学习
 

学习

发布时间:2019-07-19 14:54:56 影响了:

学习\_普法在线学习答案

普法在线学习答案 第一部分:1d c abcd abc ABC abcd √ √ √ x X √ 2B A ABCD 3 d abc 第二部分:上 1 B 2A 3D 4 B 第二部分 :下 1 C 2 C 3 B A A BD ABD √ AB X ABC √ A ABCD B AD D B ABC AB BCD ABCD ABCDD ABCDABCD √ABCD4 A A ABCD 第 三部分 :上 1 2 3 4 1 2 A D ABCD A A D 下: A A A A ABCD ABC D A ABCD ABCDABC √ X X √ X √ √ABCD ABCD ABCD ABCD ABC ABCDB ABCD 3 4A AB AABCACD√ √ABCD AB第四部分: 1 2 3 4 5 6 7 8 9 10 B D A A A D D A A B C A A A A AB A A A ABC ABCD ABC AB √ √ √ √ √ √ √ABCD ABCD ABCD ABCD ABC ABCD ABCD ABCD ABCD ABCD AB √ √A ABC ABA AB ABCD √

学习\_学习笔记

2018/7/8 stm32 按键输入实验 首先要对用到的各个 GPIO 进行初始化,使能相应时钟线上的时钟,定义结构体:选择 引脚/0~15,模式/输入输出,(速度)/5~10~50,然后把结构体的值配置到配置寄存器中。

按键, 相当于学习 GPIO 的输入, 输入只能读取数据, 通过 GPIO_ReadIntputDataBit()或 PXin(n) 来读取相应 IO 位上的高低电平.读取按键的巧妙之处是,我们用的按键都是普通按键,按下 -松开,电平变化是高-低-高 或 低-高-低,在读取按键函数中我们加了一个变量来判断按键 的按下与松开两种状态。

当按键按下时, 通过延时消抖, 对不同按键来进行不同的操作处理, (通过返回值)。

二八定理:世界上%20 的人掌握着%80 的财富。

启动代码:主要任务是初始化处理器模式,设置堆栈、初始化寄存器等。

2018/7/12 stm32 中断的学习 4.异常和中断的区别: 1>异常:是指 CPU 内部出现的中断,即在 CPU 执行特定指令时出现的非法情况。同时异常 也称为同步中断,因此只有在一条指令执行后才会发出中断 ,不可能在指令执行期间发生 异常。

a.产生的原因: 程序的错误产生的(eg:除数为 0) 内核必须处理的异常条件产生的(eg:缺页) b.异常又分为故障和陷阱,它们都不使用中断控制器,也不能被屏蔽 C.X86 处理处理器中大约有 20 中异常。Linux 内核必须为每种异常提供一个专门的异常处理 程序。

2>中断:也称为异步中断。

因此它是由其他硬件设备依照 CPU 时钟信号随机产生, 即意味着 中断能在指令之间发生。

a.中断又分为外部可屏蔽中断(INTR)和外部非屏蔽中断(NMI) 所用 I0 设备产生的中断请求均引起可屏蔽中断 硬件故障引起的故障则产生非屏蔽中断。在外设库 misc.h 定义了针对 STM32 的 NVIC 的初始化描述结构体:typedefstruct { uint8_t NVIC_IRQChannel; uint8_t NVIC_IRQChannelPreemptionPriority; uint8_t NVIC_IRQChannelSubPriority; FunctionalState NVIC_IRQChannelCmd; } NVIC_InitTypeDef; /* 中断源 */ /* 抢占优先级 */ /* 子优先级 */ /* 中断使能或者失能 */ misc.c 也定义了针对 STM32 的 NVIC 的操作函数:(1)设置优先级分组寄存器: NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityG roup) (2)初始化 NVIC_InitTypeDef 类的结构体: NVIC_Init(NVIC_InitTypeDef* NVIC_In itStruct) (3)设置中断向量表位置和偏移: NVIC_SetVectorTable(uint32_t NVIC_VectTab, ui nt32_t Offset) 系统可以选择从 SRAM 启动,也可以选择从 flash 启动,对应的启动地址会映射到 0 地址 处,而中断向量表是要被放在 0 地址处的,所以要将中 取值必须是 0x200 的整数倍(STM32 就是这么规定的)。

(4)选择进入低功耗模式的条件: NVIC_SystemLPConfig(uint8_t LowPowerMode, Fun ctionalState NewState) 参数一取值 NVIC_LP_SEVONPEND/NVIC_LP_SLEEPDEEP/NVIC_LP_SLEEPONEXIT,参数二 取值 ENABLE/DISABLE 断向量表放在 SRAM/flash 的起始位置。函数参数一的取值为 NVIC_VectTab_RAM/NVIC_VectTab_FLASH,参数二的实现绑定操作的函数声明位于标准库 LibrariesSTM32F10x_StdPeriph_Driveri ncstm32f10x_gpio.h 中:GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 参数一 GPIO_PortSource 的取值为 GPIO_PortSourceGPIOx (x = A..G), 参数二 GPIO_PinSource 的取值为 GPIO_PinSourcex(x = 0..15)? ? ?1 2 3这个函数在一般初始化 EXTI 寄存器时候调用。因为外部中断是 GPIO 引脚的复 用功能,所以同时要开启 GPIO 复用功能的时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)?1 5. EXTI 描述结构体的初始化EXTI 描述结构体声明在标准外设库 LibrariesSTM32F10x_StdPeriph_Driverin cstm32f10x_exti.h 中:typedefstruct { uint32_t EXTI_Line; EXTIMode_TypeDef EXTI_Mode; /* 中断事件线 */ /* EXTI 模式,事件/中断 */EXTITrigger_TypeDef EXTI_Trigger; /* 触发类型 */ FunctionalState EXTI_LineCmd; }EXTI_InitTypeDef;? ? ? ? ? ? ?/* EXTI 使能 */1 2 3 4 5 6 7与 EXTI 操作相关的函数有:(1)去除 EXTI_InitTypeDef 结构体的初始化:EXTI_DeInit(void) (2)初始化 EXTI_InitTypeDef 结构体: EXTI_Init(EXTI_InitTypeDef* EXTI_InitS truct) (3)默认初始化:EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) (4)EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) 产生一个软件中断 (5)获取产生中断的标志:EXTI_GetFlagStatus(uint32_t EXTI_Line) EXTI_GetITStatus(uint32_t EXTI_Line) (6)清除中断产生标志:EXTI_ClearFlag(uint32_t EXTI_Line) EXTI_ClearITPendingBit(uint32_t EXTI_Line)? ? ? ? ? ? ? ?1 2 3 4 5 6 7 8获取/清除产生中断的标志的实现是一样的,但是为什么要分成两组函数? 也许这是 STM32 标准外设库设计者出自于为兼容性考虑吧。有的 ARM 芯片的 中断体系分为两层,也就是说中断信号要抵达 NVIC 需要两层筛选,同理清除中 断标志也需要清除两层。但是在 CM3 核的 ARM 只设计了一层,STM32 为了兼 容其他芯片,依旧还是将函数设计成两层,只不过这两层的实现体是一致的。使用串口时,GPIO 管脚的配置Stm32f103 的可屏蔽中断有 60 个,ISER[0]的 31:0 和 ISER[1]的 27:0 来进行置位 中断使能, Priority 优先级 IP 寄存器是由 240 个 8bit 寄存器组成的, 而 STM32F103 只用了其中的 60 个寄存 器,59:0,而每一个 8bit 寄存器只用了其中的高 4bit,来表示抢占优先级和子优 先级,其中抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根 据 SCB->AIRCR 中的中断分组设置来决定。

这里简单介绍一下 STM32 的中断分组:STM32 将中断分为 5 个组,组 0~4。

该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。

具体的分配关系如 表 4.5.1 所示: 组 AIRCR[10:8] bit[7:4]分配情况 分配结果 0 111 0:4 0 位抢占优先级,4 位响应优先级 1 110 1:3 1 位抢占优先级,3 位响应优先级 2 101 2:2 2 位抢占优先级,2 位响应优先级 3 100 3:1 3 位抢占优先级,1 位响应优先级 4 011 4:0 4 位抢占优先级,0 位响应优先级 表 4.5.1 AIRCR 中断分组设置表 通过这个表, 我们就可以清楚的看到组 0~4 对应的配置关系, 例如组设置为 3, 那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所 代表的优先级就越高。这里需要注意两点:第一,如果两个中断的抢占优先级和 响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢 占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中 断,高优先级的响应优先级不可以打断低响应优先级的中断。

2018/7/17 二极管做与门,或门,三极管做非门,简单方便实用。

二极管的两种测试方法: 1 长正短负 2 数字万用表的二极管档 正接发光 stm32 用定时器输出 PWM 来做呼吸灯 TIM6,TIM7 这两个普通定时器无法产生 PWM 波 2018/7/18 STM32 定时器学习 高级寄存器 TIM1 和 TIM8 通用寄存器 TIM2,TIM3,TIM4,TIM5 基本寄存器 TIM6,TIM7 通用寄存器是由 时钟、时基单元、输入、输出组成。

计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式 1:外部输入脚(TIx) 外部时钟模式 2:外部触发输入(ETR) 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配 置一个定时器 Timer1 而作为另一个定时器 Timer2 的预分频器。

TIM2-7 的内部时钟来自于低速 APB1 总线,如果 APB1 分频系数为 1,则定时器 时钟等于 APB1 的时钟,若不是,则定时器时钟为 APB1 时钟的两倍。

TIM1 和 TIM8 的内部时钟来自于 APB2。

TIMX_PSC 预分频寄存器是把时钟频率进行 1~65536 进行任意值分频。

CK_INT---->预分频寄存器---->CK_CNT 那么一个时钟周期的时间T=1CK_CNT=PSC[15:0]+1Fck_pscT=1CK_CNT=PSC[15:0]+1Fck_psc由于计数器溢出会产生一次中断,故Tout (溢出) ?( ARR ? 1)(PSC[15 : 0] ? 1) Fck _ psc上述公式为何计数器 ARR 和时钟分频 PSC 都要加 1, 因为这两个值 是配置在寄存器中的,其实从 0 开始计数,故要加 1。一般使用默认系统时钟 72MHz,则 Fck _ psc ? CK _ INT模块化编程的说明: 1、模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)是 对该模块的声明。

2、某模块提供给其他模块调用的外部函数以及数据需在所对应 的.h 文件中冠以 extern 关键字来声明。

3、模块内的函数和变量需在.c 文件开头处冠以 static 关键字 声明。

4、永远不要在.h 文件定义变量。

(可以在.c 文件中定义变量,再在.h 文件中声明) 例: led1.c led1.h Led2.c uchar i = 0;extern uchar i; #include “led1.c”这样对应的是同一块内存 什么是定义?什么是声明?所谓定义就是编译器创建一个对象, 为这个对象分配一块内存并给它 取一个名字, 这个名字就是我们经常所说的变量名或者对象名, 但注 意,这个名字一旦和这块内存匹配起来,他们就要同生共死,终生不 离不弃, 并且这块内存的位置也不能改变。

一个变量或对象在一定的 区域内只能定义一次, 如果定义多次, 编译器会提醒你重复定义同一 个变量或对象。

声明有两重含义: 1、告诉编译器,这个名字已经匹配到一块内存了,下面的代码用到 的变量或对象是在别的地方定义过的,声明可以出现多次。

2、告诉编译器,这个名字已经先预定了,别的地方不能再用它来作 为变量名或对象名,比如,你在图书馆座位上放上一本书,表明这个 座位被你预定了, 但其实你本人还在食堂吃饭, 并没有人在这个座位 上。例如,函数参数的声明:void Fun(int i,char u); 区别:定义创建对象并分配了内存;而声名没有分配内存。

.h 文件是为了方便对应的.c 文件里的函数被其他.c 文件调用。

包含头文件的方式有两种: 1、#include ”stdio.h” //从当前工作目录开始搜索 2、#include <stdio.h> //是从标准库里开始搜索所以一般自己编写的头文件要用第一种, 如果是不是自己编写的头文 件用第一种。 学习 C 语言的三本书 《C Primer Plus 中文版》、《C 语言深度解剖》、《C 和指针》 程序的排版 首行缩进空格数为 4 DC-DC 的转换: 先把直流(DC)转换为交流(AC),在转换为直流(DC)。

电路设计中,任何器件都需要进行上电复位,不能直接接地。要向 下拉电阻的方式接。如图:单片机学习的重点是中断、定时器/计数器、串口。

变量的作用域: 1、全局变量 2、局部变量 变量的命名方法: 1、驼峰命名法 当一个变量名或函数名有一个或多个单词连接在一起时,第一个单词以小写字 母,第二个字母以大写字母命名,为“小驼峰式法”,例:myName;每一个单词 的首写字母都大写,为“大驼峰命名法”,例:MyName。

2、匈牙利命名法 变量名=属性+类型+对象描述 其中属性部分: 全局变量用 g_开头 如一个全局的长型变量定义为:g_lName 静态变量用 s_开头 如一个静态的指针变量定义为:s_pName 成员变量用 m_开头 如一个长型成员变量定义为:m_lName 其中类型部分: 指针 p,函数 fn,长整型 l,布尔 b,浮点型 f,双字 dw,字符串 sz,短整型 n,双精度 浮点 df,计数 c,字符型 ch,整型 i,字节 by,字 w,无符号 u,位 bt。

其中变量名使用:目标词+动词+状语+目的地 例如:DataGotFromSD

学习\_LDAP中文学习手册

LDAP 使用手册 一、 LDAP 介绍 LDAP 是轻量级目录访问协议的简称(Lightweight Directory Access Protocol).用于访问目录服务。它是 X.500 目录访问协议的移植,但是简化了实现方法。

二、 a) b) c) d) e) f) g) 目录服务与关系数据库之间的区别 目录查询操作比关系数据库有更高的效率,但是更新效率比关系数据库低 目录不支持关系数据库那样的复杂查询,比如两个表的连接。

目录不支持多操作的事物完整性,没有方式确认一些操作是全部成功还是全部失败 目录能够能好和更灵活的支持子查询和匹配查询 目录协议更适合应用于广域网,比如因特网或者大型公司的网络 目录的管理,配置,和调试比关系型数据库更简单 在使用关系数据库之前,必须首先定义表结构(模式)才可以进行操作。而目录中所使用的模式是 由 LDAP 定义好的一系列类组成的。对于目录中的每条记录中必须属于其中的一个类或者多个 类。这些类定义了该记录中可以存储的信息。

目录以对象的形式存储数据。信息被组织成树型结构。

目录服务支持分布式存储结构,容易实现数据的扩展,能满足大容量存储的要求。h) i)三、 LDAP 的优点 1:可以存储在其它条件下很难存储的管理信息 2:数据安全可靠,访问控制粒度细腻。

3:LDAP 是一个标准的,开放的协议,具有平台无关性。

4:数据分布广,规模可灵活扩充。

5:LDAP 目录服务器可以使任何一种开放源代码或商用的 LDAP 目录服务器。

四、 LDAP 模型 LDAP 模型是从 X.500 协议中继承过来的。

是 LDAP 的一个组成部分, 用于指导客户如何使用目录服 务 LDAP 定义了四个模型,包括信息模型,命名模型,功能模型,安全模型。

1.LDAP 信息模型(LDAP information model) LDAP 信息模型用于描述 LDAP 中信息的表达方式。

LDAP 信息模型包含三部分 Entries Attributes Values (条目 属性 值) Entry:Directry 中最基本的信息单元,Entry 中所包含的信息描述了现实世界中的一个真实的对象,在 目录系统中它可以理解为, 目录树中的一个节点 。

在目录中添加一个 Entry 时, 该 Entry 必须属于一个或多个 object class ,每一个 object class 规定了该 Entry 中必须要包含的属 性,以及允许使用的属性。Entry 所属的类型由属性 objectclass 规定。每一个 Entry 都有 一个 DN(distinguished name) 用于唯一的标志 Entry 在 directory 中的位置。如下 图所示: 根节点 DN 的命名有多种方法,其中之一就是域名命名法。例如:我们要以公司的网址 作为公司目录树的根节点。如 sohu.com 那么根节点的 DN 应该为 DN:dc=sohu,dc=com 上图中根节点的 DN :dc=example,dc=com 而该根节点有两个子节点,ou=people,和 ou=servers。

People 节点的 DN:ou=People,dc=example,dc=com RDN: 是 目 录 树 中 节 点 的 相 对 分 辨 名 。

如 : People 节 点 的 DN: ou=People,dc=example,dc=com 而该节点的 RDN:ou=PeopleAttribute: 每个 Entry 都是由许多 Attribute 组成的。每一个属性(Attribute)描述的是对象的一个特征。

每一个属性(Attribute)由一个类型(type)和一个或多个值组成(Value) 如下图所示:2.LDAP 命名模型(LDAP Naming Model) LDAP 命名模型定义了如何在目录系统中组织数据以及如何从目录系统中查找数据 LDAP 命名模型指定将 Entry 按类似倒立的树形结构进行规划。非常类似于 UNIX 系统得文件系 统如下图所示:Unix File SystemA Directory TreeLDAP 目录结构与 Unix 系统的文件系统主要有三点不同 1. UNIX 文件系统有一个根路径, 作为访问所有文件和目录的入口。

而 LDAP 目录结构中的 root Entry 只是一个特殊的 Entry,它包含了目录服务器的配置信息,通常情况下,并不用来存储 信息 2. 在 LDAP 目录中任何一个节点都可以包含信息,同时也可以是一个容器,也就是说任何一个 LDAP Entry 都可以有子节点。

而 UNIX 文件系统中的节点要么是一个文件, 要么是一个目录。

而不能同时是这两种情况。只有目录才可以拥有子节点。下图表示了 LDAP 是一个典型的目 录结构LDAP Directory 3. UNIX 文件系统目录结构与 LDAP 目录的第三个区别在于他们的每一个节点的命名不同。

LDAP 目录中节点的命名和 UNIX 文件系统目录结构中的节点的命名是相反的。上图示 UNIX 文件系统结构,如果要定位到 grep 节点的话,命名如下 /user/bin/grep 上图是一个典型的目录结构 第一个节点 DN 命名为:dn:dc=example,dc=com 第二个节点 DN 命名为:dn:ou=People,dc=example,dc=com 第三个节点 DN 命名为:dn:uid=bjensen,ou=people,dc=example,dc=com 我们说每一个 Entry 的 DN 是唯一的, 就是因为这种数形结构决定了,从根节点到其它任何一 个节点的路径是唯一的。

RDN:在 DN 中最左边的内容称为相对域名。如 ou=People,dc=example,dc=com 其 RDN 为 ou=People 对于共享同一个父节点的所有节点的 RDN 必须是唯一的。如果不属于同一个节点则节点的 RDN 可以相同。特殊字符: 以下字符如果出现在 Entry 中的属性值,必须进行转义 # --------# ,-------, +---------+ “---------” --------\ < ----- < > ----- >; -------- ; 如:o=United Widgets, Ltd., c=GB 别名 在 LDAP 中可以定义一个别名 Entry,指向另外一个 Entry。如下图所示如何创建别名 Entry 要创建别名 Entry,该 Entry 的 object class 必须是 alias。而且其属性 aliasedObjectName 的值必须是该 Entry 所指向的 Entry 的 DN。不过一般情况下应该避免使用别名 Entry。会 影响性能。而且如果被引用的 Entry 被删除的话,该 Entry 就会指向一个错误的结果。

LDAP URL 由于使用 Alias Entry 有许多缺点,可以使用 LDAP URL 或 referral 代替 Alias Entry。

3.LDAP 功能模型(LDAP Functional Model) LDAP 功能模型描述了 LDAP 协议可以采用的相关操作,来访问存储在目录树中的数据。

LDAP 功能模型包含一系列的操作,这些操作被分为三组。

1. 更新操作 包括添加,删除,重命名,修改 Entry 2. Interrogation Operation 用于数据的查询 3. 认证和控制 (bind unbind abandon)Interrogation Operation 1. The LDAP Search Operation该操作需要八个参数 a. base object 也可以表示为 DN。表明你想要查询 direcoty 中树的顶点。

b. search scope DN 与 search scope 两个参数限定了要搜索数据的范围 共有三个范围 scope Sub 搜索范围是包含顶节点在内的一棵子树 如下图 其中 DN =”ou=People,dc=example,dc=com” Base 搜索范围只包含一个节点 如下图其中 DN =”ou=People,dc=example,dc=com” Onelevel 其搜索范围是 DN 所表示的节点下的直接子节点。如下图 其中 DN =”ou=People,dc=example,dc=com” c. alias d. size limit 表示返回的符合条件的 Entry 的数目,0 表示返回所有符合条件的 Entry。目录服务器端返 回一个 LDAP_SIZELIMIT_ EXCEEDED。

e. time limit 表示搜索一次所需要的时间,超过时间将停止搜索。服务器端返回一个 LDAP_TIMELIMIT_EXCEEDED f. attribute-only 该属性是一个 boolean 值, 如果为 true , 表示服务器端之返回所搜索的 Entry 的属性名称, 不返回属性值。

g. filter 通过该属性可以更精确的搜索结果。就像 SQL 语句中的条件查询。

Filter 分类 1.(sn=smith) 匹配属性 sn 的值包含 smith 的 Entry 2 (sn=smith*) 匹配属性 sn 的值以 smith 开始的所有 Entry 如 smithers , smithsonain 等。其中“*”表示通配符,代表任意字符。

3 (sn~=jensen) 匹配属性 sn 的值听起来像 jensen 的 Entry。不同的目录服务器, 有不同的实现方法。

4 (age>21)或者(!(age<=21)) 匹配属性 age 的值大于 21 的 Entry 如果是字符的话,如(sn<=Smith)则按字典顺序进行比较。

5 (telephoneNumber=*) 匹配所有属性 telephoneNumber 的值不为空的 Entry 6 (&(sn=smith)(age>21))匹配属性 sn 的值包含 smith 而且属性 age 的值大于 21 的 Entry (|(sn=smith)(age>21))匹配属性 sn 的值包含 smith 或者属性 age 的值大于 21 的 Entry (&(mail=*)(!(telephoneNumber=*))) 匹配属性 mail 的值不为空,而且属性 telephoneNumber 为空的 Entry 7 如果属性的值包含以下五个特殊字符的话必须进行转义 如:(cn=A*Star) 则必须改为(cn=A2AStar)h. return attributes 该属性表示客户的搜索结果中需要返回的和用户相关的属性列表, 如果为空表示返回所有 属性。4.LDAP 安全模型 安全模型的作用:是提供一个框架,保护目录中的信息不被非法访问。

LDAP 中的安全模型主要通过身份认证、安全通道和访问控制(ACL)来实现 LDAP 是一个面向连接的协议,在能够对 LDAP 目录进行任何操作之前,LDAP 客户端必须获得 一个到 LDAP 服务端的一个连接,在这个过程中需要对 LDAP 客户端的身份进行验证,这一过程 可以理解为用户绑定。

LDAPV2 只支持简单的密码验证。

LDAPV3 实现了 SASL 安全框架,SASL 为多种验证协议提供了一种标准的验证方法,对于不同 的验证系统,可以实现特定的 SASL 机制。SASL 机制代表了一种验证协议。

在用户通过验证之后,可以为该用户分配附加的权限,比如一些用户只能查看特定的 Entry,而不 能修改。一些用户可以查看并且修改所有的 Entry 等。这一过程可以理解为访问控制。

五、 LDIF LDIF 通过一个文本文件,用来描述目录数据,可以将目录服务器中的数据导出到一个 LDIF 文件 中,并且可以将 LDIF 文件中的数据导入到另一个目录服务器。即使这两个目录服务器内部使用的 是不同的数据库格式。

有两种类型的 LDIF 文件,第一种用来描述 Directory 目录数据的,第二种包含更新语句,用于更 新现有的 Directory 条目数据。

第一种文件,内容包含两部分:第一部分是 DN,第二部分是一系列的属性-值对 如下图: 以上的 LDIF 文件只包含了一个 Directory Entry。可以在一个 LDIF 文件中包含多个 Entry 第二种文件,包含更新语句。第一行同样是 DN。第二行是更新类型,后边是要更新的属性及值。当 然也可以用来添加新的 Entry。

如下图:添加一条 Entry(注意第二行:changetype:add)如下图:删除一条 Entry如下图:修改一条 Entry 语法如下: dn: dn of entry to be modified changetype: modify modifytype: attribute type [attribute type: attribute value]添加属性示例 删除属性示例或者修改属性值也可以将多条更新语句放在一个文件里,各语句之间用“-”分开 重新命名 Entry 或移动 Entry 语法: dn: Entry的DN名称 changetype: moddn //changetype类型必须为moddn [newsuperior:如果要移动一条Entry则该项表示一个新的节点的DN] [deleteoldrdn: ( 0 | 1 )该项表示是否要删除修改以前的RDN 0不删除] [newrdn:Entry的新RDN] 由于一条 Entry 的 DN 是由该 Entry 的 RDN 和它的父节点的 DN 组成的。

一条 Entry 的 RDN 是该 Entry 中的一个属性。就像关系数据库中,主键值可以唯一区 区分一条记录一样,在同一个节点下的所有 Entry 中的 RDN 必须由唯一标识该 Entry 属性组成。

所以重新命名 Entry,也就是重新命名该 Entry 的 RDN。

示例如下: 执行以上语句后该Entry 如下所示: dn: uid=babsj, ou=People, dc=example, dc=com uid: babsj uid: bjensen 移动一条Entry示例如下:六、 LDAP 模式(schema) 如果你使用过关系型数据库,那么对模式应该不会陌生。关系数据库系统都是通过表格的形式进行 数据存储的。在这之前,我们首先要定义表结构,也即是模式。表结构由一些字段组成,每个字段 都有一个类型,以及一些约束条件。这就规定了我们可以存储的信息。

上面我们介绍过 LDAP 目录服务器中存储的信息是被组织成树型结构进行存储的。和存储信息之前 也要定义模式,不过,与关系型数据库系统不同的是,作为 LDAP 目录服务器的用户而言,一般不 需要自己定义模式,所有实现 LDAP 协议的目录服务器,都已经定义好了许多模式,这些模式可以 解决我们大部分的信息存储的问题。

LDAP 模式是由以下一些元素组成的 1:Attribute types 属性类型,也就是属性名称。我们已经介绍过,每个属性名称其实也代表着一种 属性类型。表示该属性可以存储什么样的信息。

2:Attribute syntaxes 属性语法,该元素表示每个属性名称所存储的信息如何组织。

3:匹配规则,每一个属性都有匹配规则,用于数据的比较。

4:object classes,对象类.上面已经介绍过,每个 Entry 都必须至少属于一个 object class。规定了该 Entry 可以存储那些属性。

下面介绍一下 LDAP 协议中定义的一些常用属性极其含义(具体信息看 RFC 2252 文档) 属性 c 中文名称 国家名称 描述 值为两位国家代码 如:中国:CN 美国:US 如:sohu.com dc=sohu,dc=com 国家的全名cn dc co gn homephone mail mobile o ou通用名称 域名组件 国家名称 gavenName 家庭电话号码 邮件地址 移动电话号码 组织名称 部门名称 通常为组织机构下的 一个部门或者一个大 型实体下的一个子实 体 postalCode sn st street userPassword uid departmentNumber displayName description employeeNumber manager 邮政编码 姓,别名 州或者省的名称 街道地址 用户密码 用户 ID 部门编号 显示名称 描述 员工编号 经理下面是一些 LDAP 协议中定义的 object class(具体信息查看 RFC 2252 文档) Object class account 必须属性 userid 可选属性description $ $ $ $ host $ seeAlso localityName organizationName organizationalUnitNamecountry dcObject devicec dc cnsearchGuide $ descriptionserialNumber $ description$seeAlso$ owner $ ou $ o $ linetOrgPerson->person 继承 personaudio $ businessCategory $ $ $ $ $ $ $ $ $ $ $ $ carLicense departmentNumber displayName employeeNumber employeeType homePostalAddress initials $ jpegPhoto $ $ mail photo labeledURI pager uid $$ givenName $ homePhone$ manager $ mobile $ o $ roomNumber $ secretary userCertificate x500uniqueIdentifier preferredLanguage $userSMIMECertificate$ userPKCS12 organizationalPerson 继承 Person title $ $ $ $ $ x121AddressregisteredAddress destinationIndicator telexNumber telephoneNumber$ preferredDeliveryMethod $ teletexTerminalIdentifier $ internationaliSDNNumber $ facsimileTelephoneNumb er $ street $ postOfficeBox $ $ postalCode postalAddress$ physicalDeliveryOfficeNa me $ ou $ st $ l organizationouserPassword $ searchGuide $ seeAlso $ $ $ $ $ $ businessCategory x121Address registeredAddress destinationIndicator telexNumber telephoneNumber$ preferredDeliveryMethod $ teletexTerminalIdentifier $ internationaliSDNNumber $ facsimileTelephoneNumb er $ street $ postOfficeBox $ $ postalCode postalAddress$ physicalDeliveryOfficeNa me $ st $ l $ description organizationalRolecnx121Address $ $ $ $ registeredAddress destinationIndicator telexNumber telephoneNumber$ preferredDeliveryMethod $ teletexTerminalIdentifier $ internationaliSDNNumber $ facsimileTelephoneNumb er $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ $ me $ ou postalCode postalAddress $ st $ l$ physicalDeliveryOfficeNa $ description organizationalUnitouuserPassword $ searchGuide $ seeAlso $ $ $ $ $ $ businessCategory x121Address registeredAddress destinationIndicator telexNumber telephoneNumber$ preferredDeliveryMethod $ teletexTerminalIdentifier $ internationaliSDNNumber $ facsimileTelephoneNumb er $ street $ postOfficeBox $ $ postalCode postalAddress$ physicalDeliveryOfficeNa me $ st $ l $ description personcn snuserPassword $ telephoneNumber $ seeAlso $ descriptionTop(所有类的基类)七、 常用目录服务器 1:Apache directory server 2:Sun directory server 3:openDS 一个开源的,基于 LDAP 和 DSML 标准的 Directory service。Directory service 不仅包括 Directory server,还有其它与 directory 相关的基本 service:directory proxy 、virtual dirctory、namespace distribution 和数据同步 Directory server 是一个可以通过网络访问,信息 分级存储的数据库。OpenDS 只能用在 linux 操作系统。该项目的地址为: 4: Netscape Directory Server 5: Window AD 八、 Apache directory server 安装与使用 1:下载 ApacheDS 地址为: .5/ 2:ApacheDS 的安装比较简单,没有什么特殊的设置。在 ApacheDS 安装完成后要启动 ApacheDS 服务。

路径如下:控制面板---? 管理工具---?服务--?Apache Directory server ApacheDS 的监听端口默认为 10389 3:安装 Apache directory studio。下载地址同上。该软件是 ApacheDS 的一个客户端工具。用于连接 ApacheDS,搜索,更新,删除,添加数据。安装时也没有特别设置,请按默认设置安装该软件。

4:使用 Apache directory studio 连接 ApacheDS 步骤如下: 第一步:在菜单栏中选择 LDAP 菜单下的 New Connection 选项第二步:在下面的对话框中输入相应的值。第三步:在一下对话框中输入要连接的根 DN 和密码。在 ApacheDS 安装完成后,已经创建了几个 DIT(目录信息树) ,第一次登录 ApacheDS 的话一般会连接如下输入的根节点的 DN 密码为:secret。

当然可以在第一个选项框中选择 No Authentication。这是不需要输入下面的验证信息。这种登录术语 匿名登录。权限受限制。 第四步。连接完成后,如下图:图中出现了 apahceDS 安装默认创建的三个目录信息树第五步:创建 Partition。ApacheDS 中的目录信息是保存在 Partition 中的。所以在创建新的目录树之 前首先要创建 Partition。创建 Partition 的一个方法是修改 server.xml 配置文件。该文件路径如下: C:Program FilesApache Directory Serverinstancesdefaultconf 在该文件中找到 Partitions 元素。添加<jdbmPartition>元素。第六步:创建完成之后,重启 Apache direcory server 服务。在 Apache directory studio 视图中看到结 果如下,在右侧栏中我们可以看到我们刚刚添加的 Partition。但是在左侧栏中,我们并没有看到该目 录分支存在。因为,必须要创建一个 Context Entry。 第七步:创建 Context Entry1 23 45 6九、 LDAP 应用场景 使用 JNDI 操作目录服务 1. 准备连接目录服务器的相应配置文件(以 ApacheDS 为例) apacheds.propertiesjava.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory java.naming.provider.url=ldap://localhost:10389/dc=example,dc=com java.naming.security.authentication=simple java.naming.security.principal=uid=liujz,dc=example,dc=com java.naming.security.credentials=1234562. 创建测试类 public class LDAPTest{ private static DirContext ctx =null; private PropertiesldapProps ; public LDAPTest(Properties ldapProp){ This. ldapProp = ldapProp; }public DirContext getDirContext(){ If(ctx=null){ ctx = new InitialDirContext(ldapProps); } return ctx ;} //从 LDAP 服务器中查询符合条件的 Entrypublic void queryEntry(){ SearchControls sc = new SearchControls();//用于设置查询范围 //有三种查询范围 SUBTREE_SCOPE:表示在以指定对象为根的子树中查找,可以返回多个元素 ONLEVEL_SCOPE:表示指定对象极其直接子实体 OBJECT_SCOPE:表示返回指定对象。

sc.setSearchScope(SearchControls.SUBTREE_SCOPE); //该方法有单个参数,第一个参数是 DN 是一种相对的,因为根据配置文件,我们已经连接 到根 DN 为 dc=example,dc=com 的目录树上,所以一下方法查询的 Entry 的 DN 为 ou=Account,dc=example,dc=com。第二个参数是过滤器,相当于 SQL 中的 where 子句。

第三个参数为查询控制String dn = “ou=Account”; String filter = “ou=Account”; NamingEnumeration result = getDirContext().search(dn,filter,sc); While(result.hasMore()){ SearchResult entry = (SearchResult)result.next(); Attributes attrs = entry.getAttributes(); Attribute attr = attrs.get(“ou”); System.out.println(“ou=”+attr.get()); } }//向 LDAP 服务器中添加 EntryPublic void addEntry(){ // 在 ou=account , dc=example , dc=com 节 点 下 添 加 一 个 子 节 点 。

其 RDN 为 cn=liujianzhong Attributes attrs = new BasicAttributes(); attrs.put(“cn”,”liujianzhong”); attrs.put(“sn”,”liu”); attrs.put(“userpassword”,”123456”); BasicAttribute objectClassSet = new BasicAtrribute(“objectclass”); objectClassSet.add(“top”): objectClassSet.add(“person”); objectClassSet.add(“organizationalPerson”); objectClassSet.add(“inetOrgPerson”); attrs.put(objectClassSet); ctx.createSubContext(“cn=liujianzhong,ou=Account”,attrs); }//删除 LDAP 目录服务器中指定的 Entry,如果该节点为叶子节点则直接删除,否则要先得到 该节点下的所有叶子节点,然后从最底层的叶子节点删除,直到删除所有叶子节点为止Public void delEntry(){ //删除叶子节点 String DN = “cn=liujianzhong,ou=Account” ; getDirContext().destroySubcontext(DN); //删除非叶子节点 String DN = “ou=Account,dc=example,dc=com” ; }//删除非叶子节点Public void delDN(String dn,DirContext ctx){ String root ="dc=example,dc=com"; SearchControls sc = new SearchControls(); String filter = "(objectclass=*)"; sc.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration results = ctx.search(dn, filter, sc); while(results.hasMore()){ SearchResult entry = (SearchResult)results.nextElement(); String name = entry.getNameInNamespace(); int rin = name.length()-root.length()-1; String rdn = name.substring(0, rin); delDn(rdn,ctx); } ctx.destroySubcontext(dn);} //修改 LDAP 服务器中 Entry 的属性public void modifyEntry(String dn,DirContext ctx) throws NamingException { BasicAttribute attr = new BasicAttribute("sn"); attr.add("jianzhong"); //修改属性 ModificationItem[] mods = new ModificationItem[1]; mods[0] = new ModificationItem(LdapContext.REPLACE_ATTRIBUTE,attr); ctx.modifyAttributes(dn, mods); //添加属性 BasicAttribute psw = new BasicAttribute(“userPassword”); Psw.add(“123456”); ModificationItem[] add=new ModificationItem[1]; Add[0] = new ModificationItem(LdapContext.ADD_ATTRIBUTE,psw); ctx.modifyAttributes(dn, add); //删除属性 BasicAttribute psw1= new BasicAttribute(“userPassword”); ModificationItem[] rem=new ModificationItem[1]; Rem[0] = new ModificationItem(LdapContext.ADD_ATTRIBUTE,psw1); ctx.modifyAttributes(dn, rem); }} 3. 十、

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3