LDAP使用说明文档

 

https://blog.csdn.net/white_smile/article/details/19565701

1.软件安装

1.1系统环境

  • Linux:Fedora 17 x86.64

  • Openldap:openldap2.4.33

  • PostgreSQL:PostgreSQL 9.1.6

  • unixODBC:unixODBC 2.3.1

1.2必须软件包

openldap.x86_64

openldap-clients.x86_64 #提供一些客户端程序,测试可用

openldap-servers.x86_64

openldap-servers-sql.x86_64 #后端数据库相关,必须安装

openldap-devel.x86_64 #devel包,可选择行安装

1.3安装步骤

以上这些必备软件包在fedora17下直接通过yum安装即可:

[root@fedoraopenldap]# yum install openldap.x86_64

[root@fedoraopenldap]# yum install openldap-clients.x86_64

[root@fedoraopenldap]# yum install openldap-servers.x86_64

安装完成后,查看安装包是否全部安装:

[root@fedoraopenldap]# yum list openldap*

2使用PostgreSQL作为后台数据库

2.1导入测试数据

如果使用其它关系型数据库作为LDAP的后台,则需要进行数据库的映射,目录:

/usr/share/doc/openldap-servers-sql-2.4.33/rdbms_depend里提供了各类数据库的映射文件和测试数据。测试数据和映射文件也可以从以下站点中下载:

http://www.openldap.org/faq/data/cache/978.html

导入数据之前要确认PostgreSQL和unixODBC的安装,并且PostgreSQL下建有logink数据库和unixODBC下建有Logink数据源。PostgreSQL和unixODBC的设置请参考《PostgreSQL数据库使用手册》。

往logink数据库中导入数据,运行以下命令:

[root@localhost]#cd /usr/share/doc/openldap-servers-sql-2.4.33/rdbms_depend/pgsql/

[root@localhost]#psql -U postgres logink < backsql_create.sql

[root@localhost]#psql -U postgres logink < testdb_create.sql

[root@localhost]#psql -U postgres logink < testdb_data.sql

[root@localhost]#psql -U postgres logink < testdb_metadata.sql

2.2使用管理员权限打开slapd.conf文件

  1. 在终端输入su-和密码;

  2. 运行cd /etc/openldap/;

  3. 运行geditslapd.conf使用gedit打开文件

2.3配置slapd.conf和ldap.conf文件

slapd.conf文件(红色部分为修改部分)

#

#See slapd.conf(5) for details on configuration options.

#This file should NOT be world readable.

#

include /etc/openldap/schema/corba.schema

include /etc/openldap/schema/cosine.schema

include /etc/openldap/schema/inetorgperson.schema

#Define global ACLs to disable default read access.

#引入读写权限,accessto *代表所有用户

accessto *

by selfwrite

by * read

accessto * by dn="cn=root,dc=wulisuo,dc=com" write

#Do not enable referrals until AFTER you have a working directory

#service AND an understanding of referrals.

#referral ldap://root.openldap.org

pidfile /usr/local/var/run/slapd.pid

#slapd.pid是程序运行时才生成的文件,路径可以随意指定

argsfile /usr/local/var/run/slapd.args

#同上,原本这两个文件都没有

#Load dynamic backend modules:

#modulepath /usr/local/libexec/openldap

#moduleload back_bdb.la

#moduleload back_hdb.la

#moduleload back_ldap.la

#Sample security restrictions

# Requireintegrity protection (prevent hijacking)

# Require112-bit (3DES or better) encryption for updates

# Require63-bit encryption for simple bind

#security ssf=1 update_ssf=112 simple_bind=64

#Sample access control policy:

# RootDSE: allow anyone to read it

# Subschema(sub)entry DSE: allow anyone to read it

# OtherDSEs:

# Allowself write access

# Allowauthenticated users read access

# Allowanonymous users to authenticate

# Directivesneeded to implement policy:

#access to dn.base="" by * read

#access to dn.base="cn=Subschema" by * read

#access to *

# byself write

# byusers read

# byanonymous auth

#

#if no access controls are present, the default policy

#allows anyone and everyone to read anything but restricts

#updates to rootdn. (e.g., "access to * by * read")

#

#rootdn can always read and write EVERYTHING!

#设定日志

loglevel 256

#如果想要使用PostgreSQL或MySQL数据库必须导入以下两行

modulepath /usr/lib64/openldap

moduleload back_sql.la

#######################################################################

#sqldatabase definitions

#######################################################################

database sql

#修改合适的前缀

suffix "dc=wulisuo,dc=com"

rootdn "cn=root,dc=wulisuo,dc=com"

rootpwsecret

#dbname代表ODBC中设置的数据源

dbname Logink

#dbuser代表postgresql用户

dbuser postgres

dbpasswd postgres

insentry_stmt "insertinto ldap_entries (id,dn,oc_map_id,parent,keyval) values ((selectmax(id)+1 from ldap_entries),?,?,?,?)"

upper_func "upper"

strcast_func "text"

concat_pattern "?||?"

has_ldapinfo_dn_ru no

设置完文件后运行:/usr/sbin/slaptest-f /etc/openldap/slapd.conf进行测试,如果PostgreSQL数据库中没有存在测试数据,则会出现“bi-db-openfailed! Test would using the -u ”。导入测试数据请查看相应的步骤,如果出现其他错误则根据提示进行相应改写。

ldap.conf文件:

可以不进行配置,如果要进行配置则修改以下两行:

        #BASEdc=wulisuo,dc=com

        #URIldap://ldap.wulisuo.comldap://ldap-master.wulisuo.com:666

2.4启动LDAP服务

启动LDAP服务之前先要启动PostgreSQL服务,然后运行以下命令:

[root@localhost~]# /usr/sbin/slapd -d 256 -f /etc/openldap/slapd.conf

关闭服务:运行kill-INT `cat /usr/local/var/run/slapd.pid`,其中slapd.pid的路径可以在slapd.conf中查询。

3 LDAP后端数据库操作

3.1插入节点

  1. 打开终端,运行vi init.ldif文件;

  2. 输入i开始编辑文件;

  3. 输入以下内容,其中dc和cn字段参照之前在slapd.conf中的设置:

dn:dc=wulisuo,dc=com

objectClass:dcObject

objectClass:organization

dc:wulisuo

o:wulisuoCompany

description: dCorporation

  1. 退出init.ldif文件的编辑;

  2. 执行添加命令:

    ldapadd-f init.ldif -x -D "cn=root,dc=wulisuo,dc=com" -w secret

    其中secret代表你设置的密码,如果没有设置过便为secret;

  3. 查询记录是否添加成功,运行以下命令:

    /usr/bin/ldapsearch-x -b "dc=wulisuo,dc=com"

    如果出现以下内容则表示记录添加成功,否则重新查看ldif文件里的内容:

dn:dc=wulisuo,dc=com

objectClass:dcObject

objectClass:organization

dc: wulisuo

o: wulisuoCompany

description: dCorporation

# searchresult

search: 2

result: 0Success

#numResponses: 3

# numEntries:2

3.2数据库操作

以下数据的插入需要自定义objectClass : organizationRoleorganizationUnit

数据插入

  1. 首先设置根节点属性,上一小节中已经插入了1条记录,每一条记录由一个dn来识别,如

dn:dc=wulisuo,dc=com

objectClass:dcObject

objectClass:organization

dc:wulisuo

o:wulisuoCompany

description: dCorporation

这条记录为根节点,识别标志为“dn:dc=wulisuo,dc=com”;

  1. 在原有数据记录下增加记录,可以使用文件增加记录,比如新建一个second.ldif文件,里面写入信息:

dn:ou=wuliu,dc=wulisuo,dc=com

objectClass:organizationalUnit

ou:wuliu

该条记录表示在”dn:dc=wulisuo,dc=com”下面增加一个节点,该结点的名称定义为”ou:wuliu”,里面的属性值来自”objectClass:organizationalUnit”;

  1. 运行:ldapadd-x -D "cn=root,dc=wulisuo,dc=com" -w secret -f./second.ldif

    如果出现”addingnew entry "ou=wuliu,dc=wulisuo,dc=com"则表示插入成功;

  2. 如果想在”dn:ou=wuliu,dc=wulisuo,dc=com”节点下增加一些用户节点,那么操作类似,新建一个user.ldif文件,输入:

    dn:uid=HE001,ou=wuliu,dc=wulisuo,dc=com

uid:HE001

cn:Chen Biquan

sn:Xu

userPassword:123456

objectClass:inetOrgPerson

dn:uid=HE002,ou=wuliu,dc=wulisuo,dc=com

uid:HE002

cn:Li Lin

sn:Li

userPassword:123456

objectClass:inetOrgPerson

dn:uid=HE003,ou=wuliu,dc=wulisuo,dc=com

uid:HE003

cn:Xu Lexun

sn:Xu

userPassword:123456

objectClass:inetOrgPerson

dn:uid=HE004,ou=wuliu,dc=wulisuo,dc=com

uid:HE004

cn:Ma Qiang

sn:Ma

userPassword:123456

objectClass:inetOrgPerson

dn中的ou=wuliu代表该节点隶属于”dn:ou=wuliu,dc=wulisuo,dc=com“节点;

  1. 运行命令:ldapadd-x -D "cn=root,dc=wulisuo,dc=com" -w secret -f ./user.ldif

数据删除

  1. 在ldap目录中有一条记录,删除这条记录:

    #Manager, wulisuo.com

dn:ou=Manager,dc=wulisuo,dc=com

objectClass:organizationalUnit

ou::TWFuYWdlciA=

  1. 运行命令:

ldapdelete -x-D 'cn=root,dc=wulisuo,dc=com' -w secret'ou=Manager,dc=wulisuo,dc=com'

  1. 如果删除成功则会出现相应的提示

数据修改

  1. 在ldap目录中有一条记录,修改这条记录:

# worker,wulisuo.com

dn:ou=worker,dc=wulisuo,dc=com

objectClass:organizationalUnit

ou: worker

  1. 新建一个modify.ldif文件,在里面输入内容:

dn:ou=worker,dc=wulisuo,dc=com

changetype:modify

add:description

description:TheProject Manager

  1. 运行命令:

    ldapmodify-x -D"cn=root,dc=wulisuo,dc=com" -w secret -f modify.ldif

  2. 注意:dn中的属性无法使用ldapmodify命令进行修改,想要修改dn中的属性时最好先删除,再添加记录

  3. modify.ldif文件格式,如:

    #HE004, wuliu, wulisuo.com

dn:uid=HE003,ou=wuliu,dc=wulisuo,dc=com

add:descrption

description: astudent

delete: sn

replace: mail

mail:[email protected].

数据搜索

  1. 运行命令:

    ldapsearch -D"cn=root,dc=wulisuo,dc=com" -w secret -bou=wuliu,dc=wulisuo,dc=com -s sub "(objectClass=inetOrgPerson)"> hz.ldif ;

  2. 可以设置多个条件,如:

    ldapsearch-D"cn=root,dc=wulisuo,dc=com" -w secret -bou=wuliu,dc=wulisuo,dc=com -s sub"(&(objectClass=inetOrgPerson)(uid=HE004))">hz.ldif ;

    >hz.ldif表示将结果导出到hz.ldif文件中-s代表搜索范围

  3. 另一种搜索方法:

    /usr/bin/ldapsearch-x -b "dc=wulisuo,dc=com"

远程操作

  1. ldapmodify-a -h host -p port -D <bind dn> -w <password> -f <ldiffile>

  2. ldapdelete-h host -p port -D <bind dn> -w <password> [dn1 dn2 ...]

  3. ldapsearch-h host -p port -D<bind dn> -w <password> -b<dn>-s<scope>”(filter)” >print the information into file

    例:ldapsearch-h 192.168.0.116 -p 389 -D”cn=root,dc=wulisuo,dc=com” -w secret-b ou=wuliu,dc=wulisuo,dc=com -s sub“(&(objectClass=inetOrgPerson)(uid=HE004))”> hz.ldif

3.3标识符说明

  • dn:distinguish name,用于识别一条记录,内有多个标识符组成;

  • objectClass:包含属性的类,如果引用了objectClass:person的话可以使用username和userpassword这两个属性;

  • ou:objectClass organizationUnit中的属性,如果不使用BDB数据库需要自定义;

  • cn:objectClass inteorgperson中的属性,定义为常用名称;

  • sn:objectClass inteorgperson中的属性,为姓氏部分;

  • givenName:objectClass inteorgperson中的属性,为用户姓名;

  • userPassword:objectClass inteorgperson中的属性,为用户密码;

  • telephoneNumber:objectClass inteorgperson中的属性,为电话号码;

3.4常见错误

错误1:ldap_add:Invalid syntax (21)

additionalinfo: objectclass: value #0 invalid per syntax

原因:编写ldif文件时要注意规范,每一行后面不能留有空格,否则就会出现错误,所以去掉每一之后的空格便可以了。
 

错误2:additionalinfo: operation not permitted within namingContext

原因:使用PostgreSQL作为LDAP后台数据库时,大部分的objectClass需要自行定义,给定的objectClass只有:inetOrgPerson、document、organization、referral四个。

4objectClass使用方法

4.1自定义前提条件

如果后台数据库使用的PostgreSQL或MySQL之类的数据库,自定义的objectClass必须要先在schema文件中定义,然后把它引入到slapd.conf文件中,最后在后台数据库中进行映射。

4.2重要的表和文件

导入映射文件和测试数据后,logink数据库中生成了几张关键的表:

  • ldap_entries:存储记录的dn信息;

  • ldap_oc_mappings:objectClass的映射源,里面定义了每个objectClass所对应的表和操作属性;

  • ldap_attr_mappings:定义了objectClass里的属性及其设置,属性的容器为不同的表;

  • ldap_entry_objclasses:专门用于存储辅助属性;

testdb_metadata.sql:定义了insert各个字段的含义。

4.3objectClass简介

objectClass分为:Abstract、Structural、AUXIALIARY,例如:top、penson、dcobject,用于储存记录的只能是Structural类型的objectClass,其余的只是用作扩展;自定义objectClass时要先定义一个schema文件,在文件里先定义objectClass,然后将此文件引入到slapd.conf文件中。如果引入的objectClass没有在schema文件中定义过,LDAP蒋启动不了并出现数据库出错的错误。

4.4映射organizationalRole

由于organizationalRole已经在core.schema文件中定义,所以只要进行映射便可以,不需要额外在schema文件中定义。查看organizationalRole的属性,必须属性为cn,可选属性有很多,这里我们选用registeredAddress;

步骤1在数据库logink中创建2个表:organrole、organrole_id_seq,organrole用来存储organizationalRole2个属性所代表的数据。表的创建可以通过导入sql文件,sql文件如下:

droptable organRole;

dropsequence organRole_id_seq;

createtable organRole (

idserial not null primary key,

namevarchar(255),

regAddressvarchar(255)

);

步骤2再通过导入一个sql文件创建ldap_oc_mappings、ldap_attr_mappings里的数据,即为映射的信息,sql文件如下(红色为注释部分):

--objectClass mappings: these may be viewed as structuralObjectClass,the ones that are used to decide how to build an entry

insert intoldap_oc_mappings(id,name,keytbl,keycol,create_proc,delete_proc,expect_return) values(5,'organizationalRole','organRole','id','SELECTcreate_organRole()','DELETE FROM organrole WHERE id=?',0);

--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.

insert intoldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (16,5,'cn','organRole.name','organRole',NULL,'UPDATE organRoleSET name=? WHERE id=?','UPDATE organRole SET name='''' WHERE name=?AND id=?',3,0);

insert intoldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values(17,5,'registeredAddress','organRole.regAddress','organRole',NULL,'UPDATEorganRole SET regAddress=? WHERE id=?','UPDATE organRole SETregAddress='''' WHERE (regAddress=? OR regAddress='''') ANDid=?',3,0);

--procedures

--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion

createfunction create_organRole () returns int

as '

select setval(''organRole_id_seq'', (select case when max(id) is null then 1 elsemax(id) end from organRole));

insert intoorganRole (id,name,regAddress) values ((select case when max(id) isnull then 1 else nextval(''organRole_id_seq'') end fromorganRole),'''','''');

selectmax(id) from organRole

' language'sql';

步骤3测试启动LDAP即可使用objectClassorganizationalRoel ;

4.5inetorgPerson中添加自定义属性

inetorgPerson已经在inetorgPerson.schema中定义,存放位置为/etc/openldap/schema/(不同的安装路径存放的路径也不一样)。在inetorgPerson中添加自定义属性finger,步骤如下:

步骤1在inetorgPerson.schema中添加属性finger,只要将如下信息加入到inetorgPerson.schema文件中即可:

#newatttribute:finger

attributetype( 2.16.840.1.113730.3.1.217

NAME'finger'

DESC'RFC2798: preferred written or spoken language for a person'

EQUALITYcaseIgnoreMatch

SUBSTRcaseIgnoreSubstringsMatch

SYNTAX1.3.6.1.4.1.1466.115.121.1.15{128}

SINGLE-VALUE)

步骤2在inetorgPerson.schema中修改classinetorgPerson,只要在最后添加新增加的属性即可(红色部分为添加部分):

objectclass (2.16.840.1.113730.3.2.2

NAME'inetOrgPerson'

DESC'RFC2798: Internet Organizational Person'

SUPorganizationalPerson

STRUCTURAL

MAY (

audio$ businessCategory $ carLicense $ departmentNumber $

displayName$ employeeNumber $ employeeType $ givenName $

homePhone$ homePostalAddress $ initials $ jpegPhoto $

labeledURI$ mail $ manager $ mobile $ o $ pager $

photo$ roomNumber $ secretary $ uid $ userCertificate $

x500uniqueIdentifier$ preferredLanguage $

userSMIMECertificate$ userPKCS12$ finger)

)

步骤3在数据库中新建一个表fingerInfo,用于存放finger的信息,由于inetorgPerson存放数据的表为persons,所以fingerInfo表中要添加一个外键,用于跟persons关联,生成表的sql文件如下,导入该sql文件即可:

droptable fingerInfo;

createtable fingerInfo (

id serial not null primary key,

finfo varchar(255),

pers_idint not null

);

步骤4往ldap_attr_mappings表中导入映射信息,便跟inetorgPerson关联,导入映射信息的sql文件如下,导入该sql文件即可:

--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.

insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values(18,1,'finger','fingerinfo.finfo','persons,fingerinfo','fingerinfo.pers_id=persons.id','SELECTadd_finfo(?,?)','DELETE FROM fingerinfo WHERE finfo=? ANDpers_id=?',3,0);

--procedures

--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion

createfunction add_finfo (varchar, int) returns int

as'

selectsetval (''fingerinfo_id_seq'', (select case when max(id) is null then1 else max(id) end from fingerinfo));

insertinto fingerinfo (id,finfo,pers_id)

values(nextval(''fingerinfo_id_seq''),$1,$2);

selectmax(id) from fingerinfo

'language 'sql';

步骤5重新启动LDAP即可;

4.6自行定义一个objectClass

4.6.1schema文件部份

一个objectClass包含两部分:一部分为属性的定义,另一部分为自身的定义。假设自行定义一个objectClass:myNodeObject,那么要先在/etc/openldap/schema/目录下新建一个schema文件:myNodeObject.shcema(该文件名要跟objectClass的名称一致),文件内容如下:

attributeType(1.1.2.1.100

NAME'myNodeID'

DESC'节点编号'

EQUALITYcaseIgnoreMatch

SYNTAX1.3.6.1.4.1.1466.115.121.1.15

SINGLE-VALUE)

attributeType( 1.1.2.1.101

NAME'myNodeName'

DESC'节点名称'

SYNTAX1.3.6.1.4.1.1466.115.121.1.15)

objectclass( 1.1.2.2.1

NAME'myNodeObject'

DESC'myNode'

SUPtop STRUCTURAL

MUST(myNodeID $ myNodeName))

4.6.2attributeType部份介绍

attributeType(1.1.2.1.100 ----------对象标识符

NAME'myNodeID' ----------属性的名称

DESC'节点编号' --------- 属性的描述

EQUALITYcaseIgnoreMatch ----------规则匹配

SYNTAX1.3.6.1.4.1.1466.115.121.1.15 ----------语法标识符

SINGLE-VALUE) ----------默认的多值

对象标识符(OID)是唯一的,如果想把目录建设成全球目录的一部分,应该去申请一个合法的OID,申请地址:http://pen.iana.org/pen/PenApplication.page;如果对目录没有什么要求,那么设计的对象标识符不要跟已有的对象标识符冲突就行了,属性默认的标识符前缀为1.1.2.1.......。

规则匹配和语法标志符的设计可以参考openldap官网上的《openldap-Admin-Guide》pdf文件,或是参考以下站点里的信息:http://blog.csdn.net/chong232/article/details/2257290

表1对象标识符的层次结构

OID

Assignment

1.1

Organization'sOID

1.1.1

SNMPElements

1.1.2

LDAPElements

1.1.2.1

AttributeTypes

1.1.2.1.1

x-my-Attribute

1.1.2.2

ObjectClasses

1.1.2.2.1

x-my-ObjectClass

表2常用的语法标识符

Name

OID

Description

boolean

1.3.6.1.4.1.1466.115.121.1.7

Booleanvalue

directoryString

1.3.6.1.4.1.1466.115.121.1.15

Unicode(UTF-8) string

distinguishedName

1.3.6.1.4.1.1466.115.121.1.12

LDAPDN

integer

1.3.6.1.4.1.1466.115.121.1.27

integer

numericString

1.3.6.1.4.1.1466.115.121.1.36

numericstring

OID

1.3.6.1.4.1.1466.115.121.1.38

objectidentifier

octetString

1.3.6.1.4.1.1466.115.121.1.40

arbitraryoctets

表3常用的匹配规则

Name

Type

Description

booleanMatch

equality

boolean

caseIgnoreMatch

equality

Caseinsensitive,space insensitive

caseIgnoreOrderingMatch

ordering

caseinsensitive, space insensitive

caseIgnoreSubstringsMatch

substring

caseinsensitive, space insensitive

caseExactMatch

equality

casesensitive, space insensitive

caseExactOrderingMatch

ordering

casesensitive, space insensitive

caseExactSubstringsMatch

substring

casesensitive, space insensitive

distinguishedNameMatch

equality

distinguishedname

integerMatch

equality

integer

integerOrderingMatch

ordering

integer

numericStringMatch

equality

numerical

numericStringOrderingMatch

equality

numerical

numericStringSubstringsMatch

substring

numerical

octetStringMatch

equality

octetstring

octetStringOrderingMatch

ordering

octetstring

octetStringSubstringsMatchordering

octetst

ring

objectIdentiferMatch

equality

objectidentifier

SINGLE-VALUE用来确定是否只是用一个匹配规则。

4.6.3objectClass部份介绍

objectclass( 1.1.2.2.1 ----------------对象标识符

NAME'myNodeObject' ----------objectClass名称

DESC'myNode' ---------------objectClass描述

SUPtop STRUCTURAL -------------------继承的类型

MUST(myNodeID $ myNodeName) ------------------必须的属性

MAY()) ------------------可选的属性

objectClass默认的标识符前缀为1.1.2.2......,否则就需要申请一个有效的OID,继承的类型决定了objectClass的类型,如果SUPtop dcObject,表明这个objectClass是一个抽象的对象类;如果SUPtop STRUCTURAL,表明这个objectClass可以用来存储记录;如果SUPtopAUXIALIARY表明这个objectClass是一个辅助的对象类,不能直接用来使用。

4.6.4后台数据库映射

将myNodeObject映射到PostgreSQL数据库里:

步骤1建立一张表myNode用来存放各类属性的数据,建表SQL文件如下:

droptable myNode;

createtable myNode (

id serial not null primary key,

myNodeID varchar(255),

myNodeNamevarchar(255)

);

步骤2在ldap_oc_mappings表中导入objectClass并在ldap_attr_mappings表中映射属性,SQL语句如下:

--objectClass mappings: these may be viewed as structuralObjectClass,the ones that are used to decide how to build an entry

insertinto ldap_oc_mappings(id,name,keytbl,keycol,create_proc,delete_proc,expect_return) values(5,'myNodeObject','mynode','id','SELECT create_mynode()','DELETE FROMmynode WHERE id=?',0);

--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.

insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (19,5,'myNodeID','mynode.mynodeid','mynode',NULL,'UPDATEmynode SET mynodeid=? WHERE id=?','UPDATE mynode SET mynodeid=''''WHERE (mynodeid=? OR mynodeid='''') AND id=?',3,0);

insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (20,5,'myNodeName','mynode.mynodename','mynode',NULL,'UPDATEmynode SET mynodename=? WHERE id=?','UPDATE mynode SETmynodename='''' WHERE (mynodename=? OR mynodename='''') ANDid=?',3,0);

--procedures

--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion

createfunction create_mynode () returns int

as'

selectsetval (''mynode_id_seq'', (select case when max(id) is null then 1else max(id) end from mynode));

insertinto mynode (id,mynodeid,mynodename)

values((select case when max(id) is null then 1 elsenextval(''mynode_id_seq'') end from mynode),'''','''');

selectmax(id) from mynode

'language 'sql';

步骤3将myNodeObject.schema导入到slapd.conf文件中,重启LDAP即可使用该objectClass。

猜你喜欢

转载自blog.csdn.net/u013452335/article/details/81280655