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导入测试数据

  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服务

  1. 启动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

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

  2. 运行命令: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:123456@126.com.

  • 数据搜索

  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。

LDAP使用说明文档相关推荐

  1. 如何安装husky_统一用户认证平台(Husky)说明文档

    统一用户认证平台(Husky)说明文档 1. 架构说明 主要工具 工具 版本 说明 python 3.6 2.2.15 web后端框架 16.13.1 前端框架(spa应用) mysql 5.7 数据 ...

  2. 【java】将自己写的类生成说明文档的方法

    使用工具: jdk中的javadoc 实现步骤: 1.将java文件放到一个目录之下 2.进入doc(win+R,输入cmd) 3.通过cd指令进入存放java文件的文件夹 4.编译java文件 代码 ...

  3. 一键生成表结构说明文档的参考,数据字典生成方式参考

    我们经常需要出系统的表结构说明文档,需要拿给客户看,需要给同事看,需要拿给将来做系统维护的人看,编写招标文件等时还需要把一些表结果说明等,都写入到招标文件里去,虽然这些东西,我们手工都可以做,但是工作 ...

  4. Atomikos 中文说明文档【转】

    Atomikos 翻译文档(英文文档来源:下载安装包中START_HERE.html)                                  ----译者:周枫 请尊重劳动成果,转载请标明 ...

  5. 分享个人预算系统源码(含说明文档)

    一. 描述 本文档用于简单描述预算系统使用操作过程. 预算系统可用于账户金额的管理,包括账户管理,支出记录,收入记录,支出分类,收入分类,转账,封帐,支出配置,存储计划,计划管理. 源代码和文档为个人 ...

  6. Apache安装及jboss部署说明文档

    Apache安装及jboss部署说明文档 本文为转载 http://oss.org.cn/man/newsoft/jboss.htm#_Toc124845774, 文章内容的准确性有待进一步实验 1 ...

  7. 我的产品需求说明文档模板(PRD)

    我的产品需求说明文档模板(PRD) 修订记录: 产品简介: 一句话介绍产品 产品目标: 介绍产品愿景,描绘产品蓝图 项目背景: 在什么背景下做这款产品?为什么要做这款产品?(马云爸爸说过"哪 ...

  8. vnpy官网说明文档网址

    接触VNPY一年多,一直对作者设计原理和思想有所困惑.发一篇vnpy官网的说明文档,便于以后理解项目代码. http://www.vnpy.org/archives.html 转载于:https:// ...

  9. 企业应用开发(4)(补充)--需求说明文档

    OJ系统的需求说明文档 1.引言 经过一周的修改及完善,我们基本完善了对OJ系统的需求分析,绘制了思维导图并撰写了用户故事,并设计出了与之相应的原型图. 2.思维导图 如上图所示,我们重新绘制了思维导 ...

最新文章

  1. libmemcached 1.0.11 发布
  2. PHP MongoDB 扩展安装配置
  3. OTN交换amp;P-OTN有效减少100G网络成本(一)
  4. linux网络编程之SCTP套接字常用接口
  5. Spring源码:ApplicationContextInitializer
  6. 合并压缩JavaScript,开发发布两不误
  7. mysql 导出表数据
  8. openwrt定时任务 2021-10-08
  9. Element DateTimePicker 日期时间选择器 今天日期设置,并获取value值
  10. java 文件 上传 下载
  11. Facebook营销策略大全,脸书营销技巧详细教程
  12. 微信域名防封的方法以及技术原理
  13. 啥都不说了,今天就是要送书!
  14. Spring Cloud概念+案例(eureka注册+拉取、ribbon负载均衡+重试)、netfix各组件介绍【上】
  15. Python - Excel转json
  16. C语言数据结构:什么是树?什么是二叉树?
  17. Linux下log详解
  18. 仪器仪表行业分销渠道系统:实现渠道互联网化,与渠道商互利共赢
  19. 什么是电子秤称重模块?它具有哪些功能?
  20. windows下一键安装apk

热门文章

  1. Web前端开发-1-考试总结
  2. C# XML 与 String 互转
  3. 2019年第十届蓝桥杯C/C++ A组国赛赛后总结(北京旅游总结)
  4. 个人品牌 比漂亮简历更重要
  5. JavaScript作用域的知识点
  6. 创新谈-数据库概念设计之几点见解-吴雨光
  7. 河北大学秋季计算机课,MOOC与大学计算机课程建设研讨会暨主题教学沙龙活动在河北大学召开...
  8. 单片机 串行口实验解数据流怎么到发光二极管来显示的
  9. 组合品在快消品饮料企业信息化中应用
  10. 记一次连接已重置的调试过程