﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Junky's IT Notebook-随笔分类-database</title><link>http://www.blogjava.net/junky/category/23004.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 12 Jul 2007 18:54:21 GMT</lastBuildDate><pubDate>Thu, 12 Jul 2007 18:54:21 GMT</pubDate><ttl>60</ttl><item><title>SQL SERVER 关于外联接(Outer Join)及其他</title><link>http://www.blogjava.net/junky/archive/2007/07/12/129852.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 12 Jul 2007 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/07/12/129852.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/129852.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/07/12/129852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/129852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/129852.html</trackback:ping><description><![CDATA[<p><strong>一&nbsp;使用外联接</strong></p>
<p>　　以前在Oracle中用=(+)和(+)=来进行左外联接和右外联接；后来用SQL&nbsp;Server时用*=和=*进行外连接左外联接和右外联接；<br>现在决定用SQL-92的标准方法：[OUTER]&nbsp;JOIN，OUTER是可以省略的。</p>
<p>　　LEFT&nbsp;OUTER&nbsp;JOIN&nbsp;或&nbsp;LEFT&nbsp;JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示左外联接&nbsp;</p>
<p>　　RIGHT&nbsp;OUTER&nbsp;JOIN&nbsp;或&nbsp;RIGHT&nbsp;JOIN&nbsp;&nbsp;&nbsp;表示左外联接&nbsp;</p>
<p>　　FULL&nbsp;OUTER&nbsp;JOIN&nbsp;或&nbsp;FULL&nbsp;JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示左外联接</p>
<p>　　外联接的意思不用多说，我们都懂，但是JOIN到底怎么用呢？没有找到很好的资料，只能从例子中学习了：</p>
<p>　　1、这个例子也许没有实际意义，只是为了说明问题：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">CREATE&nbsp;TABLE&nbsp;orders(order_id&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;firm_id&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;p_id&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
CREATE&nbsp;TABLE&nbsp;firms&nbsp;(firm_id&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;f_name&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
CREATE&nbsp;TABLE&nbsp;products(p_id&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;p_name&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
select&nbsp;a.order_id,&nbsp;b.f_name,&nbsp;c.p_name
from&nbsp;orders&nbsp;a&nbsp;left&nbsp;join&nbsp;firms&nbsp;b&nbsp;on&nbsp;a.firm_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b.firm_id
left&nbsp;join&nbsp;products&nbsp;c&nbsp;on&nbsp;a.p_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;c.p_id</span></div>
</pre>
</div>
<p>　　说明：orders表是主表，先和从表firms进行左联接，再和从表products进行左联接。</p>
<p>　　判断是外联接中的主表还是从表主要看from从句中各个表在LEFT&nbsp;JOIN或RIGHT&nbsp;JOIN两边的位置：LEFT&nbsp;JOIN左边的表是主表，RIGHT&nbsp;JOIN右边的表是主表；</p>
<p>　　ON表达了两个表连接的条件，一般外联接是等值联接，不等值联接意义不大；</p>
<p>　　在多个表的连接中，一个表既可以做主表又同时可以做从表，为了说明这个问题，我们修改以上SQL为：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">select&nbsp;a.order_id,&nbsp;b.f_name,&nbsp;c.p_name
from&nbsp;orders&nbsp;a&nbsp;left&nbsp;join&nbsp;firms&nbsp;b&nbsp;on&nbsp;a.firm_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b.firm_id
right&nbsp;join&nbsp;products&nbsp;c&nbsp;on&nbsp;a.order_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;c.p_id</span></div>
</pre>
</div>
<p>　　这个SQL没有什么意义，但从中可以看出a表既是b的主表又是c的从表；到底怎么用，还是要根据实际情况来决定是左联接还是右联接；</p>
<p>　　那天，看到了这样一个例子：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">create&nbsp;table&nbsp;tab1&nbsp;(c1&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c2&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c3&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
create&nbsp;table&nbsp;tab2&nbsp;(c1&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c2&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c3&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
create&nbsp;table&nbsp;tab3&nbsp;(c1&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c2&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c3&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
create&nbsp;table&nbsp;tab4&nbsp;(c1&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c2&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;c3&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)
SELECT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">
FROM&nbsp;tab1&nbsp;LEFT&nbsp;OUTER&nbsp;JOIN&nbsp;tab2&nbsp;ON&nbsp;tab1.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab2.c3
left&nbsp;OUTER&nbsp;JOIN&nbsp;tab3&nbsp;right&nbsp;OUTER&nbsp;JOIN&nbsp;tab4
ON&nbsp;tab3.c1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c1
ON&nbsp;tab2.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c3</span></div>
</pre>
</div>
<p>　　这种用法还真少见，具体怎么个意思，还在理解中...我把它改写成：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">SELECT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">
FROM&nbsp;tab1&nbsp;left&nbsp;JOIN&nbsp;tab2&nbsp;ON&nbsp;tab1.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab2.c3
LEFT&nbsp;OUTER&nbsp;JOIN&nbsp;tab4&nbsp;ON&nbsp;tab2.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c3
RIGHT&nbsp;OUTER&nbsp;JOIN&nbsp;tab3&nbsp;&nbsp;ON&nbsp;tab3.c1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c1</span></div>
</pre>
</div>
<p>　　也许它们是一个意思。我发现加个括号，看的更清楚一些（它是个嵌套）</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">SELECT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">
FROM&nbsp;tab1&nbsp;LEFT&nbsp;OUTER&nbsp;JOIN&nbsp;tab2&nbsp;ON&nbsp;tab1.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab2.c3
left&nbsp;OUTER&nbsp;JOIN
(tab3&nbsp;right&nbsp;OUTER&nbsp;JOIN&nbsp;tab4
ON&nbsp;tab3.c1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c1)
ON&nbsp;tab2.c3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tab4.c3</span></div>
</pre>
</div>
<p>　　<strong>二&nbsp;外联接中&nbsp;"ON&nbsp;+&nbsp;AND"&nbsp;与&nbsp;"ON&nbsp;+&nbsp;WHERE"&nbsp;的区别</strong></p>
<p>　　1、on条件是外联接时在生成临时表时使用的联结条件，不论从表是确定值还是NULL，主表所有的值都会出现；</p>
<p>　　如果再加上and条件；&nbsp;如果and条件引用的是主表的列，则对结果毫无影响，主表的所有纪录依然会全部出现；如果and条件引用的是从表的列，则不符合条件的从表纪录显示NULL；</p>
<p>　　2、where条件是在临时表生成后，再对临时表进行过滤的条件。临时表中的所有纪录都受影响，不符合条件的纪录被过滤出结果集；</p>
<p>　　3、示例：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">select&nbsp;a.module_id,&nbsp;a.name,&nbsp;b.module_name
from&nbsp;fb_autocoding&nbsp;a&nbsp;left&nbsp;join&nbsp;fb_app_module&nbsp;b
on&nbsp;a.module_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b.module_id
and&nbsp;b.module_internal_label&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">LO</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;
select&nbsp;a.module_id,&nbsp;a.name,&nbsp;b.module_name
from&nbsp;fb_autocoding&nbsp;a&nbsp;left&nbsp;join&nbsp;fb_app_module&nbsp;b
on&nbsp;a.module_id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b.module_id
where&nbsp;b.module_internal_label&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">LO</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;
</span></div>
</pre>
</div>
<p>　　<strong>三&nbsp;其他Join运算</strong></p>
<p>　　merge&nbsp;join：在处理其他联结之前，先把相关两个表联结在一起；</p>
<p>　　hash&nbsp;join：把一个表join到已经被执行过join的结果上；</p>
<p>　　用括号改变join的顺序：</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><span style="COLOR: #000000">select&nbsp;catalog.item,&nbsp;catalog.item_color,&nbsp;product.item,&nbsp;color.color_name
from&nbsp;catalog&nbsp;full&nbsp;outer&nbsp;join&nbsp;(product&nbsp;cross&nbsp;join&nbsp;color)
on&nbsp;catalog.item&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;product.item
and&nbsp;catalog.item_color&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;color.color_name;</span></div>
</pre>
</div>
<div style="DISPLAY: none">1</div>
<img src ="http://www.blogjava.net/junky/aggbug/129852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-07-12 15:44 <a href="http://www.blogjava.net/junky/archive/2007/07/12/129852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft LDAP 错误代码 </title><link>http://www.blogjava.net/junky/archive/2007/06/26/126308.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 26 Jun 2007 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/26/126308.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126308.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/26/126308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126308.html</trackback:ping><description><![CDATA[<p><font color=#0000ff size=2><a href="http://support.microsoft.com/kb/218185/"><u>http://support.microsoft.com/kb/218185/</u></a></font></p>
<p><font size=2>Microsoft Windows 2000 Active Directory 使用 Internet 标准的轻量级目录访问协议 (LDAP) 来访问信息。在响应各种 LDAP 请求时，域控制器会返回包含域 LDAP 错误代码的响应，这些错误代码指示协议操作的状态。本文将介绍这些错误代码。</font></p>
<br>
<div class=sbody style="FONT-SIZE: 14px" twffan="done">下表描述了这些错误代码。
<div class=indent twffan="done">
<pre class=in_text>     代码                               值      说明
---------------------------------------------------------------------------
LDAP_SUCCESS                      0x00   请求成功。
LDAP_OPERATIONS_ERROR             0x01   LDAP 库初始化失败。
LDAP_PROTOCOL_ERROR               0x02   出现协议错误。
LDAP_TIMELIMIT_EXCEEDED           0x03   超出时间限制。
LDAP_SIZELIMIT_EXCEEDED           0x04   超出大小限制。
LDAP_COMPARE_FALSE                0x05   比较结果为 FALSE。
LDAP_COMPARE_TRUE                 0x06   比较结果为 TRUE。
LDAP_AUTH_METHOD_NOT_SUPPORTED    0x07   不支持此身份验证方法。
LDAP_STRONG_AUTH_REQUIRED         0x08   需要加强的身份验证。
LDAP_REFERRAL_V2                  0x09   LDAP 版本 2 检索。
LDAP_PARTIAL_RESULTS              0x09   接收到部分结果和检索。
LDAP_REFERRAL                     0x0a   出现检索。
LDAP_ADMIN_LIMIT_EXCEEDED         0x0b   超出服务器上的管理限制。
LDAP_UNAVAILABLE_CRIT_EXTENSION   0x0c   没有精密扩展。
LDAP_CONFIDENTIALITY_REQUIRED     0x0d   需要保密。
LDAP_NO_SUCH_ATTRIBUTE            0x10   请求的属性不存在。
LDAP_UNDEFINED_TYPE               0x11   类型未定义。
LDAP_INAPPROPRIATE_MATCHING       0x12   出现不适当的匹配。
LDAP_CONSTRAINT_VIOLATION         0x13   出现约束冲突。
LDAP_ATTRIBUTE_OR_VALUE_EXISTS    0x14   属性已存在或已被赋值。
LDAP_INVALID_SYNTAX               0x15   语法无效。
LDAP_NO_SUCH_OBJECT               0x20   对象不存在。<br>
ld_matched 在LDAP_NO_SUCH_OBJECT<br>
错误返回事件中，这个参数包含DN匹配的程度；
LDAP_ALIAS_PROBLEM                0x21   别名无效。
LDAP_INVALID_DN_SYNTAX            0x22   辨别名的语法无效。
LDAP_IS_LEAF                      0x23   该对象为叶对象。
LDAP_ALIAS_DEREF_PROBLEM          0x24   无法取消对别名的引用。
LDAP_INAPPROPRIATE_AUTH           0x30   身份验证不正确。
LDAP_INVALID_CREDENTIALS          0x31   提供的凭据无效。
LDAP_INSUFFICIENT_RIGHTS          0x32   用户无足够的访问权限。
LDAP_BUSY                         0x33   服务器忙。
LDAP_UNAVAILABLE                  0x34   服务器不可用。
LDAP_UNWILLING_TO_PERFORM         0x35   服务器不处理目录请求。
LDAP_LOOP_DETECT                  0x36   引用链循环回至引用服务器。
LDAP_NAMING_VIOLATION             0x40   存在命名冲突。
LDAP_OBJECT_CLASS_VIOLATION       0x41   存在对象类别冲突。
LDAP_NOT_ALLOWED_ON_NONLEAF       0x42   不允许在非叶对象上操作。
LDAP_NOT_ALLOWED_ON_RDN           0x43   不允许在 RDN 上操作。
LDAP_ALREADY_EXISTS               0x44   对象已存在。
LDAP_NO_OBJECT_CLASS_MODS         0x45   无法修改对象类别。
LDAP_RESULTS_TOO_LARGE            0x46   返回的结果太大。
LDAP_AFFECTS_MULTIPLE_DSAS        0x47   多个目录服务代理受到影响。
LDAP_OTHER                        0x50   出现未知错误。
LDAP_SERVER_DOWN                  0x51   无法联系 LDAP 服务器。
LDAP_LOCAL_ERROR                  0x52   出现本地错误。
LDAP_ENCODING_ERROR               0x53   出现编码错误。
LDAP_DECODING_ERROR               0x54   出现解码错误。
LDAP_TIMEOUT                      0x55   搜索超时。
LDAP_AUTH_UNKNOWN                 0x56   出现未知的身份验证错误。
LDAP_FILTER_ERROR                 0x57   搜索筛选器不正确。
LDAP_USER_CANCELLED               0x58   用户已取消操作。
LDAP_PARAM_ERROR                  0x59   传递给例程的参数不正确。
LDAP_NO_MEMORY                    0x5a   系统内存不足。
LDAP_CONNECT_ERROR                0x5b   无法建立到服务器的连接。
LDAP_NOT_SUPPORTED                0x5c   不支持此功能。
LDAP_CONTROL_NOT_FOUND            0x5d   ldap 函数找不到指定控件。
LDAP_NO_RESULTS_RETURNED          0x5e   不支持此功能。
LDAP_MORE_RESULTS_TO_RETURN       0x5f   将返回其他结果。
LDAP_CLIENT_LOOP                  0x60   检测到客户循环。
LDAP_REFERRAL_LIMIT_EXCEEDED      0x61   超出检索限制。
LDAP_SASL_BIND_IN_PROGRESS        0x0E   多阶段绑定的中间绑定结果
</pre>
</div>
</div>
<div class=appliesTo twffan="done">
<hr>
<h5><font size=3>这篇文章中的信息适用于:</font></h5>
<table class=list>
    <tbody>
        <tr>
            <td class=bullet>?</td>
            <td class=text>Microsoft Windows 2000 Server</td>
        </tr>
        <tr>
            <td class=bullet>?</td>
            <td class=text>Microsoft Windows 2000 Advanced Server</td>
        </tr>
        <tr>
            <td class=bullet>?</td>
            <td class=text>Microsoft Windows 2000 Datacenter Server</td>
        </tr>
    </tbody>
</table>
</div>
<div class=appliesTo twffan="done">详细的英文解释：</div>
<div class=appliesTo twffan="done">
<div class=storycontent twffan="done">
<p><span style="FONT-FAMILY: SimSun; blue: " twffan="done">蓝色是我的翻译，红色是不能确定的翻译文字，黑色嘛，是原文。</span></p>
<div twffan="done">
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top><em><strong>Hex</strong></em></td>
            <td vAlign=top><em><strong>Decimal</strong></em></td>
            <td vAlign=top><em><strong>Constant: Description</strong></em></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;00</td>
            <td vAlign=top>0</td>
            <td vAlign=top>LDAP_SUCCESS: Indicates the requested client operation completed successfully.<br><font face=宋体>成功，没什么好说的了。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;01</td>
            <td vAlign=top>1</td>
            <td vAlign=top>LDAP_OPERATIONS_ERROR: Indicates an internal error. The server is unable to respond with a more specific error and is also unable to properly respond to a request. It does not indicate that the client has sent an erroneous message.<br><font color=#0000ff><font face=宋体>一个内部错误。Server无法正确的 respond 一个request，也无法生成说明错误类型的 respond 。它不代表client 发送了错误的消息。</font></font> In NDS 8.3x through NDS 7.xx, this was the default error for NDS errors that did not map to an LDAP error code. To conform to the new LDAP drafts, NDS 8.5 uses 80 (0&#215;50) for such errors.<br><font color=#0000ff><font face=宋体>In NDS 8.3x through NDS 7.xx, 这是一个没有映射到 LDAP错误码的NDS缺省错误。为了符合新的 LDAP草案，NDS 8.5使用80 (0&#215;50) 代表这个错误。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;02</td>
            <td vAlign=top>2</td>
            <td vAlign=top>LDAP_PROTOCOL_ERROR: Indicates that the server has received an invalid or malformed request from the client.<br><font color=#0000ff><font face=宋体>Server 从 client 收到了一个无效的或者格式不正确的request 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;03</td>
            <td vAlign=top>3</td>
            <td vAlign=top>LDAP_TIMELIMIT_EXCEEDED: Indicates that the operation&#8217;s time limit specified by either the client or the server has been exceeded. On search operations, incomplete results are returned.<br><font color=#0000ff><font face=宋体>超出了 Server或者Client指定的时间限制。当进行 serach的时候，返回不完全的结果。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;04</td>
            <td vAlign=top>4</td>
            <td vAlign=top>LDAP_SIZELIMIT_EXCEEDED: Indicates that in a search operation, the size limit specified by the client or the server has been exceeded. Incomplete results are returned.<br><font color=#0000ff><font face=宋体>在查询的时候，超出了Server或者 Client指定的size限制。返回不完全的结果。 </font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;05</td>
            <td vAlign=top>5</td>
            <td vAlign=top>LDAP_COMPARE_FALSE: Does not indicate an error condition. Indicates that the results of a compare operation are false.<br><font color=#0000ff><font face=宋体>不是错误状态。表示比较操作的结果是 false 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;06</td>
            <td vAlign=top>6</td>
            <td vAlign=top>LDAP_COMPARE_TRUE: Does not indicate an error condition. Indicates that the results of a compare operation are true.<br><font color=#0000ff><font face=宋体>不是错误状态。表示比较操作的结果是 true 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;07</td>
            <td vAlign=top>7</td>
            <td vAlign=top>LDAP_AUTH_METHOD_NOT_SUPPORTED: Indicates that during a bind operation the client requested an authentication method not supported by the LDAP server.<br><font color=#0000ff><font face=宋体>当进行bind操作时， client指定的认证方式不被LDAP Server支持。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;08</td>
            <td vAlign=top>8</td>
            <td vAlign=top>LDAP_STRONG_AUTH_REQUIRED: Indicates one of the following:
            <p>
            <ul>
                <li>In bind requests, the LDAP server accepts only strong authentication.
                <li>In a client request, the client requested an operation such as delete that requires strong authentication.
                <li>In an unsolicited notice of disconnection, the LDAP server discovers the security protecting the communication between the client and server has unexpectedly failed or been compromised. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>代表下列情况之一：</font></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;09</td>
            <td vAlign=top>9</td>
            <td vAlign=top>Reserved.<br><font face=宋体 color=#0000ff>保留的</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0A</td>
            <td vAlign=top>10</td>
            <td vAlign=top>LDAP_REFERRAL: Does not indicate an error condition. In LDAPv3, indicates that the server does not hold the target entry of the request, but that the servers in the referral field may.<br><font face=宋体><font color=#0000ff>不是错误状态。在LDAPv3 中，代表Server无法得到请求的Entry 目标，</font>但是可以介绍一个可能得到的域(field)<font color=#0000ff>。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0B</td>
            <td vAlign=top>11</td>
            <td vAlign=top>LDAP_ADMINLIMIT_EXCEEDED: Indicates that an LDAP server limit set by an administrative authority has been exceeded.<br><font face=宋体>LDAP Server 的被权限管理指定的有限集合被超出。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0C</td>
            <td vAlign=top>12</td>
            <td vAlign=top>LDAP_UNAVAILABLE_CRITICAL_EXTENSION: Indicates that the LDAP server was unable to satisfy a request because one or more critical extensions were not available. Either the server does not support the control or the control is not appropriate for the operation type.<br><font face=宋体><font color=#0000ff>LDAP Server不支持的request ，因为一个或者多个</font>重要<font color=#0000ff>的扩展是不允许的。Server 不支持的</font>Control<font color=#0000ff>或者</font>Control</font> <font face=宋体 color=#0000ff>对于操作是不恰当的。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0D</td>
            <td vAlign=top>13</td>
            <td vAlign=top>LDAP_CONFIDENTIALITY_REQUIRED: Indicates that the session is not protected by a protocol such as Transport Layer Security (TLS), which provides session confidentiality.<br><font color=#0000ff><font face=宋体>Session没有被诸如Transport Layer Security (TLS) 之类的协议保护，无法提供Session机密性。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0E</td>
            <td vAlign=top>14</td>
            <td vAlign=top>LDAP_SASL_BIND_IN_PROGRESS: Does not indicate an error condition, but indicates that the server is ready for the next step in the process. The client must send the server the same SASL mechanism to continue the process.<br><font color=#0000ff><font face=宋体>不是错误状态，代表Server已经为 process的下一步做好了准备。Client必须发送相同的 SASL给Server以继续process 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;0F</td>
            <td vAlign=top>15</td>
            <td vAlign=top>Not used.<br><font face=宋体 color=#0000ff>未使用。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;10</td>
            <td vAlign=top>16</td>
            <td vAlign=top>LDAP_NO_SUCH_ATTRIBUTE: Indicates that the attribute specified in the modify or compare operation does not exist in the entry.<br><font color=#0000ff><font face=宋体>在modify或者 compare操作中指定的属性，在指定Entry中不存在。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;11</td>
            <td vAlign=top>17</td>
            <td vAlign=top>LDAP_UNDEFINED_TYPE: Indicates that the attribute specified in the modify or add operation does not exist in the LDAP server&#8217;s schema.<br><font color=#0000ff><font face=宋体>在modify或者 add操作中指定的属性，在LDAP Server的 Schema中不存在。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;12</td>
            <td vAlign=top>18</td>
            <td vAlign=top>LDAP_INAPPROPRIATE_MATCHING: Indicates that the matching rule specified in the search filter does not match a rule defined for the attribute&#8217;s syntax.<br><font color=#0000ff><font face=宋体>在Search Filter 中指定的 rule不能和syntax中的rule 定义匹配。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;13</td>
            <td vAlign=top>19</td>
            <td vAlign=top>LDAP_CONSTRAINT_VIOLATION: Indicates that the attribute value specified in a modify, add, or modify DN operation violates constraints placed on the attribute. The constraint can be one of size or content (string only, no binary).<br><font color=#0000ff><font face=宋体>在modify、</font></font> <font color=#0000ff><font face=宋体>add或者modify DN 操作中指定的属性值，触犯了属性中的限制。那些限制是内容长度或者内容只能是String，不能是binary 等。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;14</td>
            <td vAlign=top>20</td>
            <td vAlign=top>LDAP_TYPE_OR_VALUE_EXISTS: Indicates that the attribute value specified in a modify or add operation already exists as a value for that attribute.<br><font color=#0000ff><font face=宋体>在modify或者</font></font> <font color=#0000ff><font face=宋体>add操作中指定的属性值，在属性中已经存在了。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;15</td>
            <td vAlign=top>21</td>
            <td vAlign=top>LDAP_INVALID_SYNTAX: Indicates that the attribute value specified in an add, compare, or modify operation is an unrecognized or invalid syntax for the attribute.<br><font color=#0000ff><font face=宋体>在add、 compare或者modify 操作中指定的属性值，是不认识或者无效的 syntax 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top></td>
            <td vAlign=top>22-31</td>
            <td vAlign=top>Not used.<br><font face=宋体 color=#0000ff>未使用。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;20</td>
            <td vAlign=top>32</td>
            <td vAlign=top>LDAP_NO_SUCH_OBJECT: Indicates the target object cannot be found. This code is not returned on following operations:
            <p>
            <ul>
                <li>Search operations that find the search base but cannot find any entries that match the search filter.
                <li>Bind operations. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>无法找到目标Object 。在以下操作中不返回这个代码： </font></font></p>
            <ul>
                <li>Search<span style="FONT-FAMILY: SimSun" twffan="done">操作中没有找到任何匹配</span>serach filter <span style="FONT-FAMILY: SimSun" twffan="done">的</span>entry<span style="FONT-FAMILY: SimSun" twffan="done">。</span>
                <li>Bind<span style="FONT-FAMILY: SimSun" twffan="done">操作。</span> </li>
            </ul>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;21</td>
            <td vAlign=top>33</td>
            <td vAlign=top>LDAP_ALIAS_PROBLEM: Indicates that an error occurred when an alias was dereferenced.<br><font face=宋体>当一个别名被复引用时发生错误。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;22</td>
            <td vAlign=top>34</td>
            <td vAlign=top>LDAP_INVALID_DN_SYNTAX: Indicates that the syntax of the DN is incorrect. (If the DN syntax is correct, but the LDAP server&#8217;s structure rules do not permit the operation, the server returns LDAP_UNWILLING_TO_PERFORM.)<br><font color=#0000ff><font face=宋体>DN的句法不对。( 如果DN句法正确，但是LDAP Server 的结构规则不许可这个操作，Server返回LDAP_UNWILLING_TO_PERFORM 。 )</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;23</td>
            <td vAlign=top>35</td>
            <td vAlign=top>LDAP_IS_LEAF: Indicates that the specified operation cannot be performed on a leaf entry. (This code is not currently in the LDAP specifications, but is reserved for this constant.)<br><font color=#0000ff><font face=宋体>指定的操作不能被实施于一个叶子Entry 上。( 这个错误码不在当前的LDAP 规范中，但是这个常数为此而保留。 )</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;24</td>
            <td vAlign=top>36</td>
            <td vAlign=top>LDAP_ALIAS_DEREF_PROBLEM: Indicates that during a search operation, either the client does not have access rights to read the aliased object&#8217;s name or dereferencing is not allowed.<br><font face=宋体><font color=#0000ff>在search 操作中， client无权读</font>别名了的<font color=#0000ff> 对象名或者间接引用是不被许可的。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top></td>
            <td vAlign=top>37-47</td>
            <td vAlign=top>Not used.<br><font face=宋体 color=#0000ff>未使用。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;30</td>
            <td vAlign=top>48</td>
            <td vAlign=top>LDAP_INAPPROPRIATE_AUTH: Indicates that during a bind operation, the client is attempting to use an authentication method that the client cannot use correctly. For example, either of the following cause this error:
            <p>
            <ul>
                <li>The client returns simple credentials when strong credentials are required.
                <li>The client returns a DN and a password for a simple bind when the entry does not have a password defined. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>当bind操作过程中， client试图使用不正确的认证方式。例如，以下情况造成这个error： </font></font></p>
            <ul>
                <li>Client<span style="FONT-FAMILY: SimSun" twffan="done">返回简单认证当需要</span>strong credentials<span style="FONT-FAMILY: SimSun" twffan="done"> 的时候。</span>
                <li>Client<span style="FONT-FAMILY: SimSun" twffan="done">返回</span> DN<span style="FONT-FAMILY: SimSun" twffan="done">和密码为了简单认证，但是</span> entry<span style="FONT-FAMILY: SimSun" twffan="done">没有定义密码。</span> </li>
            </ul>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;31</td>
            <td vAlign=top>49</td>
            <td vAlign=top>LDAP_INVALID_CREDENTIALS: Indicates that during a bind operation one of the following occurred:
            <p>
            <ul>
                <li>The client passed either an incorrect DN or password.
                <li>The password is incorrect because it has expired, intruder detection has locked the account, or some other similar reason. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>当bind操作过程中发生以下情况： </font></font></p>
            <ul>
                <li>Client<span style="FONT-FAMILY: SimSun" twffan="done">传送不正确的</span>DN<span style="FONT-FAMILY: SimSun" twffan="done">或者</span> password <span style="FONT-FAMILY: SimSun" twffan="done">。</span>
                <li><span style="FONT-FAMILY: SimSun" twffan="done">密码不正确，因为它过期了，入侵检测锁住了帐号，或者其他类似原因。</span> </li>
            </ul>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;32</td>
            <td vAlign=top>50</td>
            <td vAlign=top>LDAP_INSUFFICIENT_ACCESS: Indicates that the caller does not have sufficient rights to perform the requested operation.<br><font face=宋体 color=#0000ff>调用者没有足够的权限执行请求的操作。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;33</td>
            <td vAlign=top>51</td>
            <td vAlign=top>LDAP_BUSY: Indicates that the LDAP server is too busy to process the client request at this time but if the client waits and resubmits the request, the server may be able to process it then.<br><font color=#0000ff><font face=宋体>LDAP Server太忙以至于无法处理client 的请求，但是如果client等待然后重新提交请求，Server 可能会处理。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;34</td>
            <td vAlign=top>52</td>
            <td vAlign=top>LDAP_UNAVAILABLE: Indicates that the LDAP server cannot process the client&#8217;s bind request, usually because it is shutting down.<br><font color=#0000ff><font face=宋体>LDAP Server不能处理client 的bind请求，通常是因为它down 机了。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;35</td>
            <td vAlign=top>53</td>
            <td vAlign=top>LDAP_UNWILLING_TO_PERFORM: Indicates that the LDAP server cannot process the request because of server-defined restrictions. This error is returned for the following reasons:
            <p>
            <ul>
                <li>The add entry request violates the server&#8217;s structure rules.
                <li>The modify attribute request specifies attributes that users cannot modify.
                <li>Password restrictions prevent the action.
                <li>Connection restrictions prevent the action. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>LDAP Server不能处理request ，因为Server定义的限制。</font></font><br><font color=#0000ff><font face=宋体>这个错误在以下原因下发生：</font></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;36</td>
            <td vAlign=top>54</td>
            <td vAlign=top>LDAP_LOOP_DETECT: Indicates that the client discovered an alias or referral loop, and is thus unable to complete this request.<br><font color=#0000ff><font face=宋体>client 发现一个别名或者引用是循环的，导致这个request 无法完成。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top></td>
            <td vAlign=top>55-63</td>
            <td vAlign=top>Not used.<br><font face=宋体 color=#0000ff>未使用。</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;40</td>
            <td vAlign=top>64</td>
            <td vAlign=top>LDAP_NAMING_VIOLATION: Indicates that the add or modify DN operation violates the schema&#8217;s structure rules. For example,
            <p>
            <ul>
                <li>The request places the entry subordinate to an alias.
                <li>The request places the entry subordinate to a container that is forbidden by the containment rules.
                <li>The RDN for the entry uses a forbidden attribute type. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>在 add或者 modify DN操作中违反Schema的结构规则。例如： </font></font></p>
            <ul>
                <li><span style="FONT-FAMILY: SimSun" twffan="done">请求放置</span>entry<span style="FONT-FAMILY: SimSun" twffan="done">在别名下</span>
                <li><span style="FONT-FAMILY: SimSun" twffan="done">请求放置</span>entry<span style="FONT-FAMILY: SimSun" twffan="done">在被包含规则禁止的容器中</span>
                <li>Entry<span style="FONT-FAMILY: SimSun" twffan="done">的</span>RDN<span style="FONT-FAMILY: SimSun" twffan="done">使用了禁止的属性类型</span> </li>
            </ul>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;41</td>
            <td vAlign=top>65</td>
            <td vAlign=top>LDAP_OBJECT_CLASS_VIOLATION: Indicates that the add, modify, or modify DN operation violates the object class rules for the entry. For example, the following types of request return this error:
            <p>
            <ul>
                <li>The add or modify operation tries to add an entry without a value for a required attribute.
                <li>The add or modify operation tries to add an entry with a value for an attribute which the class definition does not contain.
                <li>The modify operation tries to remove a required attribute without removing the auxiliary class that defines the attribute as required. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>在 add、 modify或者modify DN操作中违反 entry的object class规则。例如，下面类型的 request导致这个错误：</font></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;42</td>
            <td vAlign=top>66</td>
            <td vAlign=top>LDAP_NOT_ALLOWED_ON_NONLEAF: Indicates that the requested operation is permitted only on leaf entries. For example, the following types of requests return this error:
            <p>
            <ul>
                <li>The client requests a delete operation on a parent entry.
                <li>The client request a modify DN operation on a parent entry. </li>
            </ul>
            <p><font color=#0000ff><font face=宋体>请求的操作只允许在叶子entry上执行。例如下面类型的 request导致这个错误：</font></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;43</td>
            <td vAlign=top>67</td>
            <td vAlign=top>LDAP_NOT_ALLOWED_ON_RDN: Indicates that the modify operation attempted to remove an attribute value that forms the entry&#8217;s relative distinguished name.<br><font color=#0000ff><font face=宋体>modify操作试图删除关联着DN 的属性值。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;44</td>
            <td vAlign=top>68</td>
            <td vAlign=top>LDAP_ALREADY_EXISTS: Indicates that the add operation attempted to add an entry that already exists, or that the modify operation attempted to rename an entry to the name of an entry that already exists.<br><font color=#0000ff><font face=宋体>add操作试图加一个已经存在的Entry ，或者modify操作试图重命名Entry 为一个已经存在的entry的名字。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;45</td>
            <td vAlign=top>69</td>
            <td vAlign=top>LDAP_NO_OBJECT_CLASS_MODS: Indicates that the modify operation attempted to modify the structure rules of an object class.<br><font color=#0000ff><font face=宋体>modify操作试图改变object class 的结构规则。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;46</td>
            <td vAlign=top>70</td>
            <td vAlign=top>LDAP_RESULTS_TOO_LARGE: Reserved for CLDAP.<br><font color=#0000ff><font face=宋体>为CLDAP保留。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;47</td>
            <td vAlign=top>71</td>
            <td vAlign=top>LDAP_AFFECTS_MULTIPLE_DSAS: Indicates that the modify DN operation moves the entry from one LDAP server to another and thus requires more than one LDAP server.<br><font color=#0000ff><font face=宋体>modify DN的操作移动Entry 从一个LDAP Server到另一个，造成需要超过一个LDAP Server 。</font></font></td>
        </tr>
        <tr>
            <td vAlign=top></td>
            <td vAlign=top>72-79</td>
            <td vAlign=top>Not used.<br><font face=宋体 color=#0000ff>未使用</font></td>
        </tr>
        <tr>
            <td vAlign=top>0&#215;50</td>
            <td vAlign=top>80</td>
            <td vAlign=top>LDAP_OTHER: Indicates an unknown error condition. This is the default value for NDS error codes which do not map to other LDAP error codes.<br><font color=#0000ff><font face=宋体>一个未知的error状态。这是 NDS中没有映射到其他LDAP错误码上的错误码的缺省值。</font></font></td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/junky/aggbug/126308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-26 12:08 <a href="http://www.blogjava.net/junky/archive/2007/06/26/126308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAPErrorCodes</title><link>http://www.blogjava.net/junky/archive/2007/06/26/126279.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 26 Jun 2007 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/26/126279.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126279.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/26/126279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hex            Decimal            Constant: Description                                            0x00                                                0                            ...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2007/06/26/126279.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/126279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-26 10:33 <a href="http://www.blogjava.net/junky/archive/2007/06/26/126279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenLDAP快速上手(转)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122379.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122379.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122379.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122379.html</trackback:ping><description><![CDATA[<p><span>OpenLDAP</span> <span>快速上手</span> </p>
<p><span><span>&nbsp;&nbsp; </span>Ben </span><span>的项目里面要用到</span> <span>OpenLDAP,</span> <span>我的项目里面也要用到</span> <span>LDAP,</span> <span>所以这</span> <span>2</span> <span>天集中看了一下</span> <span>LDAP</span> <span>相关的内容。做了个笔记，也算是为人类知识的积累做点或有或无的贡献。</span> </p>
<p><span><span>&nbsp;&nbsp; </span>OpenLDAP</span> <span>的官方站点是</span> <span><a href="http://www.openldap.org/">http://www.openldap.org</a> </span><span>。</span> </p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>上面有个</span> <span>QuickStart,</span> <span>我将大致按照这个来讲解。</span> </p>
<p><span>一、</span> <span>安装</span> <span><br></span><span>在官方站点上发布的是</span> <span>linux/unix</span> <span>下的</span> <span>OpenLDAP</span> <span>源文件，当然也很容易找到</span> <span>windows</span> <span>系统下的版本。笔者学习安装的就是</span> <span>windows</span> <span>版本的。</span> </p>
<p><span>二、</span> <span>配置</span> </p>
<p><span>OpenLDAP</span> <span>有</span> <span>2</span> <span>个用户最关注的配置文件。</span> </p>
<p><span>一个是</span> <em><span>slapd.conf</span> </em><em><span>，</span> </em><em><span>在他里面定义了最基本的</span> </em><em><span>DN</span> </em><em><span>以及管理员的账号和密码。</span> </em><em></em></p>
<p><em><span>另一个是</span> </em><em><span>LDIF</span> </em><em><span>的文件。在它里面可以配置所有的用户和组织。</span> </em><em></em></p>
<p><em><span>1、&nbsp;</span></em><em><span>我们先来了解</span> </em><em><span>LDAP</span> </em><em><span>的相关概念。</span> </em><em><span><br></span></em><em><span>我们知道</span> </em><em><span>LDAP</span> </em><em><span>的全称为（</span> </em><span>Lightweight Directory Access Protocol</span> <em><span>），即轻量级目录访问协议。</span> </em><em></em></p>
<p><em><strong><span>Ldap</span> </strong></em><em><strong><span>是怎样的一个结构呢</span> </strong></em><em><span>？用官方的话说：&#8220;</span> </em><span>In LDAP, directory entries are arranged in a hierarchical tree-like structure. Traditionally, this structure reflected the geographic and/or organizational boundaries. Entries representing countries appear at the top of the tree. Below them are entries representing states and national organizations. Below them might be entries representing organizational units, people, printers, documents, or just about anything else you can think of..</span> <em><span>&#8221;他是一个树状的结构。每一个节点被称为一个</span> </em><em><span>Entry</span> </em><em><span>。这些</span> </em><em><span>Entry</span> </em><em><span>有着有趣的含义。</span> </em><em></em></p>
<p><em><span>下面是他的</span> </em><em><span>2</span> </em><em><span>个实例。一个反映了</span> </em><span>geographic</span> <span>，一个反映了</span> <span>organizational</span> <span>。<br></span><span><img src="http://www.openldap.org/doc/admin23/intro_tree.gif"> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传统命名<br><img src="http://www.openldap.org/doc/admin23/intro_dctree.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网络命名<br><br></span><span>我们来看看个个节点的定义方式。</span> </p>
<p><strong><span>每个</span> <span>Entry</span> </strong><strong><span>都有一个自己得一个标示</span> </strong><span>，我们把他叫</span> <span>DN(Distinguished Name)</span> <span>，这个</span> <span>dn</span> <span>包含了一个</span> <span>RDN</span> <span>（</span> <span>Relative Distinguished Name</span> <span>）。在上面的第二个图例</span> <span>中，<span>Barbara Jensen的RDN是</span></span> <tt><span>uid=babs，他的dn是</span> </tt><tt><span>uid=babs,ou=People,dc=example, dc=com。</span> </tt></p>
<p><tt><strong><span>每个节点都需要一个类别</span> </strong></tt><tt><span>，</span> </tt><tt><span>这个类别信息用<span>objectClass来表示。ObjectClass就是该节点的schema,他定义了该节点该有和不该有的属性。默认的objectClass都在schema/core.schema中有定义。如果在你的配置过程中出现了关于找不到objectClass的问题，您不妨参看一下这里面有没有你用到的objectClass</span></span> </tt><tt><span>.</span> 在schema文件夹下还有其他一些schema文件,你也可以定义自己的schema.想要加载其他的schema,你可以在slapd.conf文件中用include加入.如:<font face=宋体>include&nbsp;&nbsp;./schema/core.schema.</font></tt> <span>为了方便识别，其实我们在<span>DN里面用的都是objectClass的简写形式。如：ou代表organizationUnit，c代表country,st代表state,dc代表？？等。</span></span> <em></em></p>
<p><em><span>2、&nbsp;</span></em><em><span>来看看</span> <span>slapd.conf</span> </em><em><span>这个文件</span> </em><em><span><br></span></em><em><span>这个文件的主要信息是如下几行：</span> </em><em></em></p>
<p><em><span>database bdb </span></em></p>
<p><em><span>suffix "dc=&lt;MY-DOMAIN&gt;,dc=&lt;COM&gt;" </span></em></p>
<p><em><span>rootdn "cn=Manager,dc=&lt;MY-DOMAIN&gt;,dc=&lt;COM&gt;" </span></em></p>
<p><em><span>rootpw secret </span></em></p>
<p><em><span>directory /usr/local/var/openldap-data</span> </em></p>
<p><em><span>定义了数据库，最基本的后缀，管理员的</span> </em><em><span>dn</span> </em><em><span>和密码，以及数据存放路径。</span> </em><em></em></p>
<p><em><span>编辑好这个文件，我们就可以启动了。</span> </em><em></em></p>
<p><em><span>如果你把</span> </em><em><span>ldap</span> </em><em><span>安装为</span> </em><em><span>windows</span> </em><em><span>服务，你可以像我一样启动：</span> </em><em></em></p>
<p><em><span>net start OpenLDAP-slapd</span> </em></p>
<p><em>&nbsp; </em></p>
<p><em><span>3、&nbsp;</span></em><em><span>我们主要操作的就是这个</span> </em><em><span>LDIF</span> </em><em><span>文件</span> </em><em><span><br></span></em><em><span>我们需要在这个文件里面加入所需要的</span> </em><em><span>dn.</span> </em></p>
<p><em><span>注意，因为我们在</span> </em><em><span>slapd.conf</span> </em><em><span>中定义了一个</span> </em><em><span>base dn</span> </em><em><span>和一个管理员</span> </em><em><span>dn</span> </em><em><span>，所以我们需要首先把这</span> </em><em><span>2</span> </em><em><span>个</span> </em><em><span>dn </span></em><em><span>加进来。</span> </em><em></em></p>
<p><em><span>dn: dc=&lt;MY-DOMAIN&gt;,dc=&lt;COM&gt; </span></em></p>
<p><em><span>objectclass: dcObject </span></em></p>
<p><em><span>objectclass: organization </span></em></p>
<p><em><span>o: &lt;MY ORGANIZATION&gt; </span></em></p>
<p><em><span>dc: &lt;MY-DOMAIN&gt; </span></em></p>
<p><em>&nbsp; </em></p>
<p><em><span>dn: cn=Manager,dc=&lt;MY-DOMAIN&gt;,dc=&lt;COM&gt; </span></em></p>
<p><em><span>objectclass: organizationalRole </span></em></p>
<p><em><span>cn: Manager</span> </em></p>
<p><em><span>保存为</span> </em><em><span>ldif</span> </em><em><span>后缀的文件。然后我们用命令把这些信息加到</span> </em><em><span>ldap</span> </em><em><span>中去：</span> </em><em></em></p>
<p><tt><span>ldapadd -x -D "cn=Manager,dc=&lt;MY-DOMAIN&gt;,dc=&lt;COM&gt;" -W -f example.ldif</span> </tt></p>
<p><tt><span>让我们来查看以下我们的设置是否出现问题：</span> </tt></p>
<p><em><span>ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'</span> </em></p>
<p><em><span>上面的是</span> </em><em><span>linux/unix</span> </em><em><span>下的命令，</span> </em><em><span>windows</span> </em><em><span>下我们需要做点更改：</span> </em><em></em></p>
<p><em><span>ldapsearch -x -b dc=example,dc=com (objectclass=*)</span> </em></p>
<p><em><span>对，就是去掉引号。</span> </em><em></em></p>
<p><em><span>为了察看方便，笔者建议使用</span> </em><em><span>GUI</span> </em><em><span>工具来查看，比如笔者使用的</span> </em><em><span>Softerra LDAP Browser 2.6</span> </em><em><span>。</span> </em><em></em></p>
<p>&nbsp; </p>
<p><span>三、</span> <span>和</span> <span>java</span> <span>集成</span> <span><br></span><span>我们的</span> <span>ldap Server</span> <span>已经搭建起来了，我们需要在我们的</span> <span>java</span> <span>程序中访问这个服务。</span> </p>
<p><span>Openldap.org</span> <span>上有没有讲？有讲？下面介绍的</span> <span>JLDAP</span> <span>就是干这个的。</span> </p>
<p><span>我们需要看一下&#8220;</span> <span>Java LDAP Overview</span> <span>&#8221;里面的内容。内容不是很多，但很实用。</span> </p>
<p><span>要在</span> <span>java</span> <span>中访问</span> <span>ldap</span> <span>，我们需要一套</span> <span>api,</span> <span>你可以在下面的网站上获得：</span> </p>
<p><span><a href="http://developer.novell.com/wiki/index.php/LDAP_Classes_for_Java">http://developer.novell.com/wiki/index.php/LDAP_Classes_for_Java</a> </span></p>
<p><span>在下在的文件里面有许多的例子，在</span> <span>novell</span> <span>的网站上也有很多的例子。我就不讲了。</span> <span>Try yourself</span> <span>。</span> </p>
<img src ="http://www.blogjava.net/junky/aggbug/122379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 15:45 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openldap学习笔记(使用openldap-2.3.32)(详细)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122361.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122361.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122361.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122361.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 13px">本文系作者原创，转载请保留出处：<a href="http://marion.cublog.cn/" target=_blank><font color=#000000>http://marion.cublog.cn</font></a><br>其中理解可能也有不当之处，欢迎各位指正。<br><br><font color=blue><font size=3>第一部分：openldap介绍</font></font><br><br>一、Directory Services(目录服务)能做什么？<br><br>&nbsp; &nbsp; 我们知道，当局域网的规模变的越来越大时，为了方便主机管理，我们使用DHCP来实现IP地址、以太网地址、主机名和拓扑结构等的集中管理和统一分配。同样，如果一个局域网内有许多的其它资源时，如打印机、共享文件夹等等，为了方便的定位及查找它们，一种集中定位管理的方式或许是较好的选择，DNS和NIS都是用来实现类似管理的方法。<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; 对于局域网内的一个用户来讲，工作等其它应用需要，我们必须凭帐号登录主机、用帐号收发E-mail，甚至为了管理需要公司还需要维护一个电子号码簿来存储员工的姓名、地址、电话号码等信息。随着时间的增长，我们会为这些越来越多的帐号和密码弄的头晕脑胀。同时，如果一个员工离开，管理员就不得不翻遍所有的记录帐号信息的文件把离职员工的信息删除。这些将是一个繁琐而效率低下的工作。那么，如果能将此些帐号信息等统一到一个文件中进行管理，无疑会大大提高员工及管理员的工作效率。目录服务（LDAP是其实现的一种）正是基于这些应用实现的。<br><br>二、什么是LDAP？<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; LDAP是Lightweight Directory Access Protocol的缩写，顾名思义，它是指轻量级目录访问协议（这个主要是相对另一目录访问协议X.500而言的；LDAP略去了x.500中许多不太常用的功能，且以TCP/IP协议为基础）。目录服务和数据库很类似，但又有着很大的不同之处。数据库设计为方便读写，但目录服务专门进行了读优化的设计，因此不太适合于经常有写操作的数据存储。同时，LDAP只是一个协议，它没有涉及到如何存储这些信息，因此还需要一个后端数据库组件来实现。这些后端可以是bdb(BerkeleyDB)、ldbm、shell和passwd等。<br><br>&nbsp; &nbsp; LDAP目录以树状的层次结构来存储数据（这很类同于DNS），最顶层即根部称作&#8220;基准DN&#8221;，形如"dc=mydomain,dc=org"或者"o=mydomain.org"，前一种方式更为灵活也是Windows AD中使用的方式。在根目录的下面有很多的文件和目录，为了把这些大量的数据从逻辑上分开，LDAP像其它的目录服务协议一样使用OU（Organization Unit），可以用来表示公司内部机构，如部门等，也可以用来表示设备、人员等。同时OU还可以有子OU，用来表示更为细致的分类。<br><br>&nbsp; &nbsp; LDAP中每一条记录都有一个唯一的区别于其它记录的名字DN（Distinguished Name）,其处在&#8220;叶子&#8221;位置的部分称作RDN；如dn:cn=tom,ou=animals,dc=mydomain,dc=org中tom即为RDN；RDN在一个OU中必须是唯一的。<br><br>三、什么是LDIF？<br><br>&nbsp; &nbsp; LDIF(LDAP Interchange Format)是指存储LDAP配置信息及目录内容的标准文本文件格式，之所以使用文本文件来格式来存储这些信息是为了方便读取和修改，这也是其它大多数服务配置文件所采取的格式。LDIF文件常用来向目录导入或更改记录信息，这些信息需要按照LDAP中schema的格式进行组织，并会接受schema的检查，如果不符合其要求的格式将会出现报错信息。LDIF文件样例如下：<br><br>#LDIF file example<br>dn: dc=mydomain,dc=org<br>objectClass: domain<br>dc: mydomain<br><br>&nbsp; &nbsp; 其中，以&#8220;#&#8221;号开头的为注释行；第二行起的行中，冒号左边为属性，右边是属性的值，这类同于编程中的变量及为其所赋的值，但属性可以被重复赋值。<br><br>四、objectClass <br><br>&nbsp; &nbsp; LDAP中，一条记录必须包含一个objectClass属性，且其需要赋予至少一个值。每一个值将用作一条LDAP记录进行数据存储的模板；模板中包含了一条记录中数个必须被赋值的属性和一系列可选的属性。如上述LDIF文件中的记录所示，objectClass的值为domain。<br><br>&nbsp; &nbsp; objectClass有着严格的等级之分，最顶层的类是top和alias。例如，organizationalPerson这个objectClass隶属于Person,而Person又是top的子类。<br><br>&nbsp; &nbsp; objectClass大致分为三类：结构型的（如：person和organizationUnit）、辅助型的（如：extensibeObject）和抽象型的（这类不能直接使用）。官方定义的objectClass,如下所示：<br><br>alias <br>applicationEntity <br>dSA <br>applicationProcess <br>bootableDevice <br>certificationAuthority <br>certificationAuthority-V2 <br>country <br>cRLDistributionPoint <br>dcObject <br>device <br>dmd <br>domain <br>domainNameForm <br>extensibleObject <br>groupOfNames <br>groupOfUniqueNames <br>ieee802Device <br>ipHost <br>ipNetwork <br>ipProtocol <br>ipService <br>locality <br>dcLocalityNameForm <br>nisMap <br>nisNetgroup <br>nisObject <br>oncRpc <br>organization <br>dcOrganizationNameForm <br>organizationalRole <br>organizationalUnit <br>dcOrganizationalUnitNameForm <br>person <br>organizationalPerson <br>inetOrgPerson <br>uidOrganizationalPersonNameForm <br>residentialPerson <br>posixAccount <br>posixGroup <br>shadowAccount <br>strongAuthenticationUser <br>uidObject <br>userSecurityInformation<br><br>五、Attribute介绍<br><br>&nbsp; &nbsp; 如上文所述，Attribute类同于编程语言中的变量，它可以被赋值，就像是可以存放一个单一类型信息的容器。官方声明了许多常用的Attribute,如果其中没有你所需要的，你可以自己定义，但要避免重名。objectClass是一种特殊的Attribute，它包含其它用到的Attribute以及它自身。常见的Attribute如：givenName、l、objectClass、dc、ou、cn、c、mail、telephoneNumber、sn、uid等。分别介绍如下：<br><br>c:国家；<br>cn:common name,指一个对象的名字；如果指人，需要使用其全名；<br>dc:domain Component,经常用来指一个域名的一部分，如：dc=mydomain,dc=org;<br>givenName：指一个人的名字，不能用来指姓或者middle name；<br>l:指一个地名，如一个城市或者其它地理区域的名字；<br>mail:电子信箱地址<br>o:organizationName,指一个组织的名字;<br>objectClass:一个LDAP server要想启用必须能够识别每一个对象的Attribute，objectClass Attribute正是用来描述一个对象应该具有的Attribute及可选Attribute。因此，每个objectClass&#8220;模板&#8221;的Attribute中必然含有一条objectClass Attribute，我不知道用&#8220;自包含&#8221;称呼这个算不算合适。<br>ou:organizationalUnitName,指一个组织单元的名字。<br>sn:surname,指一个人的姓;<br>telephoneNumber:电话号码，应该带有所在的国家的代码；<br>uid:userid,通常指一个人的登录名，这个不同于Linux系统中用户的uid； <br><br>&nbsp; &nbsp; 如果可以这样类比的话，我想，我们不妨把objectClass理解为关系数据库的表，而attribute则类同为表中的字段。而下面即可介绍的schema或许可以类比作一个数据库，但它的这个类比或许从逻辑上说更合适些。<br><br>六、什么是schema<br><br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;好了，现在可以说说到底什么是schema了。LDAP中，schema用来指定一个目录中所包含的objects的类型（objectClass）以及每一个objectClass中的各个必备（mandatory）和可选（optional）的属性（attribute）。因此，<font color=orange>Schema是一个数据模型，它被用来决定数据怎样被存储，被跟踪的数据的是什么类型，存储在不同的Entry下的数据之间的关系。</font>schema需要在主配置文件slapd.conf中指定，以用来决定本目录中使用到的objectClass。管理员可以自己设计制定schema，一般包括属性定义（AttributeDefinition）、类定义（ClassDefinition）以及语法定义（SyntaxDefinition）等部分。&nbsp;&nbsp;<br><br>&nbsp; &nbsp; LDAP V3中在x.500标准的基础上定义了一个包含了网络中大多常见对象的schema，这些对象包括国家、所在地、组织、人员、小组以及设备等。同时，LDAP V3中可以很方便的从目录中提取出schema，它正是一条记录中关于属性的声明部分。<br><br>七、对象标识符（Object Identifiers）<br><br>&nbsp; &nbsp;&nbsp;&nbsp;对象标识符（OID）是被LDAP内部数据库引用的数字标识。Attribute的名字是设计为方便人们读取的，但为了方便计算机的处理，通常使用一组数字来标识这些对象，这类同于SNMP中的MIB2。例如，当计算机接收到dc这个Attribute时，它会将这个名字转换为对应的OID：1.3.6.1.4.1.1466.115.121.1.26。<br><br><br>八、使用LDAP做身份验正<br><br>&nbsp; &nbsp; 验正主要是用来确定一次会主中客户端用户所具有的权利，即用来确立用户能否登录以及登录具有使用哪些资源以及如何使用资源的权限。验正过程中的修改、查询等操作由认证级别来控制。<br><br>&nbsp; &nbsp; objectClass中的person可以用来作linux系统中用户登入的身份验正，此时需要指定userPassword属性的值，即指定用户登入时使用的密码。密码可以使用的加密方式有MD5、CRYPT、SHA、SSHA等。在LDAP V3中，验正客户端时可以使用的验正机制有匿名验正、简单验正、基于SSL/TLS的验正和基于SASL的验正等四种方式。<br><br><font color=blue><font size=3>第二部分：安装配置Openldap-2.3.32</font></font><br><br>&nbsp; &nbsp; 目前有许多种软件可以实现LDAP，如Windows AD,Openldap等。我们要实现的是在RedHat9.0上安装Openldap来实现其应用。<br><br>&nbsp; &nbsp; 为了让openldap支持ssl/tls和sasl，我们这次的安装将首先安装openssl0.98e和cyrus-sasl-2.0.22这两个软件包。<br><br>一、安装openssl0.98e<br><br>1.1 下载相关软件包至/usr/local/src目录 <br><br><a href="http://www.openssl.org/source/openssl-0.9.8e.tar.gz" target=_blank><font color=#000000>http://www.openssl.org/source/openssl-0.9.8e.tar.gz</font></a><br><br>1.2 安装openssl<br><br>#cd /usr/local/src<br>#tar zxvf openssl-0.9.8e.tar.gz<br>#cd openssl-0.9.8e<br>#./config shared zlib<br>#make <br>#make test<br>#make install<br>mv /usr/bin/openssl /usr/bin/openssl.OFF<br>mv /usr/include/openssl /usr/include/openssl.OFF<br>ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl<br>ln -s /usr/local/ssl/include/openssl /usr/include/openssl<br><br>1.3 配置库文件搜索路径<br><br>#echo "/usr/local/ssl/lib" &gt;&gt; /etc/ld.so.conf<br>#ldconfig -v<br><br>1.4 查看openssl的版本号，以验正是否安装正确<br><br>#openssl version -a<br>OpenSSL 0.9.8e 17 Apr 2007<br>built on: Sat Mar 24 21:24:41 CST 2007<br>platform: linux-elf<br>options:&nbsp;&nbsp;bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) idea(int) blowfish(idx) <br>compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM<br>OPENSSLDIR: "/usr/local/ssl"<br><br><br>二、安装cyrus-sasl-2.0.22<br><br>2.1 下载cyrus-sasl-2.1.22到/usr/local/src<br><a href="http://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.22.tar.gz" target=_blank><font color=#000000>http://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.22.tar.gz</font></a><br><br>2.2 编译安装<br><br>#tar zxvf cyrus-sasl-2.1.22.tar.gz<br>#cd&nbsp;&nbsp;cyrus-sasl-2.1.22<br># ./configure --prefix=/usr/local/sasl2 --enable-login --with-openssl=/usr/local/ssl<br>#make<br>#make install<br><br>2.3配置库文件搜索路径<br><br>#echo "/usr/local/sasl2/lib" &gt;&gt; /etc/ld.so.conf<br>#echo "/usr/local/sasl2/lib/sasl2" &gt;&gt; /etc/ld.so.conf<br>#ldconfig -v<br><br>2.4 把Redhat9.0原有的sasl库文件改名或删除，并将相关符号链接指向新安装SASL的库文件<br><br>#cd /usr/lib<br># mv libsasl2.a libsasl2.a.OFF<br># mv libsasl2.la libsasl2.la.OFF<br># mv libsasl2.so libsasl2.so.OFF<br># mv libsasl2.so.2.0.10 libsasl2.so.2.0.10.OFF<br># mv lIbsasl2.so.2 libsasl2.so.2.OFF<br><br># ln -s /usr/local/sasl2/lib/* /usr/lib<br># ln -s /usr/local/sasl2/lib/sasl2 /usr/lib/sasl2<br><br>#ln -s /usr/local/sasl2/lib/libsasl2.so.2.0.22 /usr/lib/libsasl2.so.2<br>#ln -s /usr/local/sasl2/lib/libsasl2.so /usr/lib/libsasl2.so<br><br>2.5 创建运行时需要的目录并调试启动<br><br>#mkdir -pv /var/state/saslauthd&nbsp; &nbsp;&nbsp; &nbsp;<br><br># ./saslauthd -a pam shadow -d<br>saslauthd[3533] :main&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;: num_procs&nbsp;&nbsp;: 5<br>saslauthd[3533] :main&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;: mech_option: NULL<br>saslauthd[3533] :main&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;: run_path&nbsp; &nbsp;: /var/state/saslauthd<br>saslauthd[3533] :main&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;: auth_mech&nbsp;&nbsp;: pam<br>saslauthd[3533] :ipc_init&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;: using accept lock file: /var/state/saslauthd/mux.accept<br>saslauthd[3533] :detach_tty&nbsp; &nbsp;&nbsp; &nbsp;: master pid is: 0<br>saslauthd[3533] :ipc_init&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;: listening on socket: /var/state/saslauthd/mux<br>saslauthd[3533] :main&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;: using process model<br>saslauthd[3534] :get_accept_lock : acquired accept lock&nbsp; &nbsp;&nbsp;&nbsp;（此处使用"ctrl+c"退出）<br>saslauthd[3533] :have_baby&nbsp; &nbsp;&nbsp; &nbsp; : forked child: 3534<br>saslauthd[3533] :have_baby&nbsp; &nbsp;&nbsp; &nbsp; : forked child: 3535<br>saslauthd[3533] :have_baby&nbsp; &nbsp;&nbsp; &nbsp; : forked child: 3536<br>saslauthd[3533] :have_baby&nbsp; &nbsp;&nbsp; &nbsp; : forked child: 3537<br><br>2.6 启动并测试验正<br><br>#/usr/local/sasl2/sbin/saslauthd -a pam shadow<br><br>#/usr/local/sasl2/sbin/testsaslauthd -u root -p root的密码<br>0: OK "Success."<br><br>三、安装BerkeleyDB<br><br>3.1 下载相关软件至/usr/local/src<br><br><a href="http://www.oracle.com/technology/software/products/berkeley-db/htdocs/popup/db/4.5.20/db-targz.html" target=_blank><font color=#000000>http://www.oracle.com/technology ... .5.20/db-targz.html</font></a><br><br>3.2 编译安装<br><br>#tar zxvf db-4.5.20.tar.gz<br>#cd db-4.5.20/build_unix<br>#../dist/configure --prefix=/usr/local/BerkeleyDB<br>#make<br>#make install<br><br>四、安装openldap-2.3.32<br><br>4.1 下载相关软件至/usr/local/src<br><br><a href="http://www.openldap.org/software/download/OpenLDAP/openldap-stable/openldap-stable-20070110.tgz" target=_blank><font color=#000000>http://www.openldap.org/software ... stable-20070110.tgz</font></a><br><br>4.2 编译安装<br><br>#tar zxvf openldap-stable-20070110.tgz<br>#cd openldap-2.3.32<br>#env CPPFLAGS="-I/usr/local/BerkeleyDB/include -I/usr/local/sasl2/include" LDFLAGS="-L/usr/local/BerkeleyDB/lib -L/usr/local/sasl2/lib -L/usr/local/sasl2/lib/sasl2"&nbsp;&nbsp;./configure --prefix=/usr/local/openldap --sysconfdir=/etc/openldap --enable-passwd --enable-wrappers --disable-ipv6 --enable-spasswd --enable-crypt --enable-modules&nbsp;&nbsp;--enable-accesslog=yes<br>#make depend<br>#make<br>#make test<br>#make install<br>#cp /usr/local/openldap/var/openldap-data/DB_CONFIG.example /usr/local/openldap/var/openldap-data/DB_CONFIG<br><br>4.3 测试启动<br><br># /usr/local/openldap/libexec/slapd -d 256<br>@(#) $OpenLDAP: slapd 2.3.32 (Apr 17 2007 00:44:16) $<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#111;&#116;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;&#46;&#108;&#111;&#99;&#97;"><font color=#000000>root@localhost.loca</font></a>ldomain:/usr/local/src/openldap-2.3.32/servers/slapd<br>Expect poor performance for suffix dc=my-domain,dc=com.<br>slapd starting<br><br>4.4 启动及关闭服务<br><br>启动<br>#/usr/local/openldap/libexec/slapd<br><br>查看监听的端口<br># netstat -tunlp |grep :389<br>tcp&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;0&nbsp; &nbsp;&nbsp; &nbsp;0 0.0.0.0:389&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 0.0.0.0:*&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;LISTEN&nbsp; &nbsp;&nbsp; &nbsp;10111/slapd <br><br>查看能否正常查询<br># /usr/local/openldap/bin/ldapsearch -x -b '' -s base '(objectclass=*)' (此行为命令，以下为结果)<br># extended LDIF<br>#<br># LDAPv3<br># base &lt;&gt; with scope baseObject<br># filter: (objectclass=*)<br># requesting: ALL<br>#<br><br>#<br>dn:<br>objectClass: top<br>objectClass: OpenLDAProotDSE<br><br># search result<br>search: 2<br>result: 0 Success<br><br># numResponses: 2<br># numEntries: 1<br><br><br>关闭 <br>#kill -INT `cat /usr/local/openldap/var/run/slapd.pid`<br><br><br>五、主配置文件slapd.conf介绍<br><br>安全起见，slapd.conf文件应该只让运行此进程的用户可读写。下面是安装完毕后的一个slapd.conf示例。<br><br>#<br># See slapd.conf(5) for details on configuration options.<br># This file should NOT be world readable.<br>#<br>include&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/etc/openldap/openldap/schema/core.schema<br><br># Define global ACLs to disable default read access.<br><br># Do not enable referrals until AFTER you have a working directory<br># service AND an understanding of referrals.<br>#referral&nbsp; &nbsp;&nbsp; &nbsp; ldap://root.openldap.org<br><br>pidfile&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/usr/local/openldap/var/run/slapd.pid<br>argsfile&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/usr/local/openldap/var/run/slapd.args<br><br># Load dynamic backend modules:<br># modulepath&nbsp; &nbsp; /usr/local/openldap/libexec/openldap<br># moduleload&nbsp; &nbsp; back_bdb.la<br># moduleload&nbsp; &nbsp; back_ldap.la<br># moduleload&nbsp; &nbsp; back_ldbm.la<br># moduleload&nbsp; &nbsp; back_passwd.la<br># moduleload&nbsp; &nbsp; back_shell.la<br><br># Sample security restrictions<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require integrity protection (prevent hijacking)<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require 112-bit (3DES or better) encryption for updates<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require 63-bit encryption for simple bind<br># security ssf=1 update_ssf=112 simple_bind=64<br><br># Sample access control policy:<br>#&nbsp; &nbsp;&nbsp; &nbsp; Root DSE: allow anyone to read it<br>#&nbsp; &nbsp;&nbsp; &nbsp; Subschema (sub)entry DSE: allow anyone to read it<br>#&nbsp; &nbsp;&nbsp; &nbsp; Other DSEs:<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow self write access<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow authenticated users read access<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow anonymous users to authenticate<br>#&nbsp; &nbsp;&nbsp; &nbsp; Directives needed to implement policy:<br># access to dn.base="" by * read<br># access to dn.base="cn=Subschema" by * read<br># access to *<br>#&nbsp; &nbsp;&nbsp; &nbsp; by self write<br>#&nbsp; &nbsp;&nbsp; &nbsp; by users read<br>#&nbsp; &nbsp;&nbsp; &nbsp; by anonymous auth<br>#<br># if no access controls are present, the default policy<br># allows anyone and everyone to read anything but restricts<br># updates to rootdn.&nbsp;&nbsp;(e.g., "access to * by * read")<br>#<br># rootdn can always read and write EVERYTHING!<br><br>#############################################################<br># BDB database definitions<br>#############################################################<br><br>database&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;bdb<br>suffix&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "dc=my-domain,dc=org"<br>rootdn&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "cn=Manager,dc=mydomain,dc=org"<br># Cleartext passwords, especially for the rootdn, should<br># be avoid.&nbsp;&nbsp;See slappasswd(8) and slapd.conf(5) for details.<br># Use of strong authentication encouraged.<br>rootpw&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; secret<br># The database directory MUST exist prior to running slapd AND <br># should only be accessible by the slapd and slap tools.<br># Mode 700 reorgmended.<br>directory&nbsp; &nbsp;&nbsp; &nbsp; /usr/local/openldap/var/openldap-data<br># Indices to maintain<br><br>index&nbsp; &nbsp;objectClass&nbsp; &nbsp;&nbsp;&nbsp;eq<br><br>接下来我们对上述部分进行一些介绍：<br><br>include&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/etc/openldap/openldap/schema/core.schema<br><br>此句是用来将目录所用到的schema文件包含进来；openldap一般默认带有几个schema，在我们的配置文件安装目录下的schema目录中存放。本句中的core.schema是LDAP V3中必须的，它给出了LDAP V3中最基本的attribute和objects的定义。其它的还有：corba.schema、dyngroup.schema、java.schema&nbsp;&nbsp;nis.schema、openldap.schema、cosine.schema、inetorgperson.schema、misc.schema、ppolicy.schema<br><br><br>pidfile&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/usr/local/openldap/var/run/slapd.pid<br><br>此句用来定义slapd进程运行时的pid文件，需要使用绝对路径。<br><br>argsfile&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/usr/local/openldap/var/run/slapd.args<br><br>此句用来定义包含当前正在运行的slapd进程所用到的命令行参数的文件，需要使用绝对路径。<br><br># Load dynamic backend modules:<br># modulepath&nbsp; &nbsp; /usr/local/openldap/libexec/openldap<br># moduleload&nbsp; &nbsp; back_bdb.la<br># moduleload&nbsp; &nbsp; back_ldap.la<br># moduleload&nbsp; &nbsp; back_ldbm.la<br># moduleload&nbsp; &nbsp; back_passwd.la<br># moduleload&nbsp; &nbsp; back_shell.la<br><br>以上用来指定动态加载的后端模块。<br><br># Sample security restrictions<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require integrity protection (prevent hijacking)<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require 112-bit (3DES or better) encryption for updates<br>#&nbsp; &nbsp;&nbsp; &nbsp; Require 63-bit encryption for simple bind<br># security ssf=1 update_ssf=112 simple_bind=64<br><br>以上是安全相关的声明语句。常用到的参数有五类，除了Require和security外还有Allow、Disallow和password-hash等。<br>Require参数用来使管理员指定访问目录时必须遵循的规则和条件；这种指定可以是全局的，也可以仅用来限制对某个后端数据库的访问限制。<br>security参数用来让管理员指定加强安全性的一般规则。<br><br># Sample access control policy:<br>#&nbsp; &nbsp;&nbsp; &nbsp; Root DSE: allow anyone to read it<br>#&nbsp; &nbsp;&nbsp; &nbsp; Subschema (sub)entry DSE: allow anyone to read it<br>#&nbsp; &nbsp;&nbsp; &nbsp; Other DSEs:<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow self write access<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow authenticated users read access<br>#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Allow anonymous users to authenticate<br>#&nbsp; &nbsp;&nbsp; &nbsp; Directives needed to implement policy:<br># access to dn.base="" by * read<br># access to dn.base="cn=Subschema" by * read<br># access to *<br>#&nbsp; &nbsp;&nbsp; &nbsp; by self write<br>#&nbsp; &nbsp;&nbsp; &nbsp; by users read<br>#&nbsp; &nbsp;&nbsp; &nbsp; by anonymous auth<br>#<br># if no access controls are present, the default policy<br># allows anyone and everyone to read anything but restricts<br># updates to rootdn.&nbsp;&nbsp;(e.g., "access to * by * read")<br>#<br># rootdn can always read and write EVERYTHING!<br><br>以上主要是用来定义访问控制列表。<br><br>#######################################################################<br># BDB database definitions<br>#######################################################################<br><br>database&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;bdb<br><br>定义使用的后端数据存储方式。其后可以跟的值有bdb、ldbm、passwd、config、dnssrv、ldif、perl、hdb和shell等。bdb指使用Berkley DB 4数据库。<br><br>suffix&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "dc=my-domain,dc=org"<br><br>定义suffix,以上部分可以改作你的域名中相关的部分，如"dc=example,dc=com"。<br><br>rootdn&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; "cn=Manager,dc=mydomain,dc=org"<br><br>定义此目录的超级管理员帐号，类同于系统中的root。由于访问控制对此用户是不生效的，因此存在很大的安全隐患。建议安装配置及调试完成以后移除此帐号。<br><br>rootpw&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; secret<br><br>定义超级管理员帐号的密码，这里使用的是明文存储（secret即是其密码）的方式。这是极不安全的，建议使用加密方式存储，可以使用的加密方式有：CRYPT、MD5、SMD5、SHA和SSHA。产生加密密码散列的方法是使用slappasswd命令，用-h选项指明加密时使用的方式。示例如下：<br># /usr/local/openldap/sbin/slappasswd -h {SSHA}<br>New password: <br>Re-enter new password: <br>{SSHA}k2H1GPM/95VfgsKg2jZv9hV+2GCH04hC<br><br><br>directory&nbsp; &nbsp;&nbsp; &nbsp; /usr/local/openldap/var/openldap-data<br><br>这一句用来指定目录相关数据的存放位置。此目录最好只能由运行slapd进程的用户所有，推荐权限为700<br><br>index&nbsp; &nbsp;objectClass&nbsp; &nbsp;&nbsp;&nbsp;eq<br><br>此句用来指定slapd索引时用到的attribute，eq指索引时的匹配规则。主要是用来优化查询的。常用到的匹配规则有：approx（模糊匹配,approximate）、eq（精确匹配，equality）、pres（现值匹配，若某记录的此attribute没有值则不进行匹配，presence）和sub （子串匹配，substring）。<br><br><br><br><span style="FONT-SIZE: 13px"><font color=blue>六、具体应用的实现：建立起始目录项，并导入数据</font><br><br>6.1 先建立一个创建起始结点所用的ldif文件<br><br>#vi init.ldif<br><br>输入以下内容（可以根据自己的需要修改）<br>dn: dc=mydomain,dc=org&nbsp;&nbsp;#定义根结点<br>objectClass: top<br>objectClass: domain<br>objectClass: organization<br>dc: mydomain<br>o: mydomain.org<br>description:&nbsp;&nbsp;Mydomain.org ldap<br><br><br>dn: cn=Manager,dc=mydomain,dc=org&nbsp; &nbsp; #定义目录管理员<br>objectClass: organizationalRole<br>cn: Manager<br>description: Directory Manager<br><br>dn: ou=people,dc=mydomain,dc=org&nbsp;&nbsp;#定义一个OU<br>ou: people<br>objectClass: organizationalUnit<br><br>注意：ldif文件中，每一行中冒号后有一个空格，行尾一定不能有空格。切记!<br><br>6.2使用离线import命令导入到目录中,需要离线进行（要先关闭slapd进程）<br><br>#kill -INT `cat /usr/local/openldap/var/run/slapd.pid`<br># /usr/local/openldap/sbin/slapadd -v -l ./init.ldif <br>bdb_db_open: Warning - No DB_CONFIG file found in directory /var/openldap/data-3: (2)<br>Expect poor performance for suffix dc=mydomain,dc=org.<br>added: "dc=mydomain,dc=org" (00000001)<br>added: "ou=people,dc=mydomain,dc=org" (00000002)<br><br>命令中：<br>-v选项表示启用verbose模式，即输出执行中的具体信息；<br>-l表示后面附加ldif文件。<br>其它常用的选项还有:<br>-d&nbsp;&nbsp;指定debug向日志文件输出信息，后面跟日志级别<br>-f&nbsp;&nbsp;指定要读取的配置文件<br><br>6.3 启动服务进程<br><br>#/usr/local/openldap/libexec/slapd<br><br>6.4 建立要导入的具体信息记录的ldif文件<br><br>#vi users.ldif<br><br>dn: cn=Tom Black,ou=people,dc=mydomain,dc=org&nbsp; &nbsp;定义人员1<br>cn: Tom Black<br>sn: Black<br>mail: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#111;&#109;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><font color=#000000>tom@126.com</font></a><br>telephoneNumber: 371-6338-3522<br>objectClass: inetOrgPerson<br><br>dn: cn=Jerry Smith,ou=people,dc=mydomain,dc=org&nbsp; &nbsp; 定义人员2<br>cn: Jerry Smith<br>sn: Smith<br>mail: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#101;&#114;&#114;&#121;&#64;&#115;&#105;&#110;&#97;&#46;&#99;&#111;&#109;"><font color=#000000>jerry@sina.com</font></a><br>telephoneNumber: 371-6338-3521<br>objectClass: inetOrgPerson<br><br>6.5 导入ldif文件<br><br># /usr/local/openldap/bin/ldapadd -D "cn=Manager,dc=mydomain,dc=org" -W -x&nbsp;&nbsp;-f users.ldif <br>Enter LDAP Password: <br>adding new entry "cn=Tom Black,ou=people,dc=mydomain,dc=org"<br><br>adding new entry "cn=Jerry Smith,ou=people,dc=mydomain,dc=org"<br><br>命令中:<br>-D选项表示指定绑定到LDAP的DN；<br>-W表示提示用户输入密码；<br>-x表示使用简单身份验正方式，默认的是使用sasl进行验正；<br>-f用来指定ldif文件;<br><br>七、配置文件中的高级功能使用方法<br><br>1. 开启日志功能<br><br>启用日志功能，需要在编译时指定--enable-debug 选项，默认是允许的。要打开slapd的日志功能，需要在slapd.conf中的全局配置段添加loglevel指令，并后跟一个十进制数字表示的日志级别，如下所示：<br><br># Added logging parameters<br>loglevel&nbsp; &nbsp;&nbsp;&nbsp;256<br><br>其日志级别如下所示：<br><br>-1&nbsp; &nbsp; &nbsp; &nbsp; 记录所有的信息<br>0&nbsp; &nbsp; &nbsp; &nbsp; 不记录debug<br>1&nbsp; &nbsp; &nbsp; &nbsp; 跟踪功能调用的信息<br>2&nbsp; &nbsp; &nbsp; &nbsp; 包处理的debug信息<br>4&nbsp; &nbsp; &nbsp; &nbsp; 丰富的debug信息<br>8&nbsp; &nbsp; &nbsp; &nbsp; 连接管理信息<br>16&nbsp; &nbsp; &nbsp; &nbsp; 包的收发信息<br>32&nbsp; &nbsp; &nbsp; &nbsp; 搜索过滤的处理过程<br>64&nbsp; &nbsp; &nbsp; &nbsp; 配置文件的处理过程<br>128&nbsp; &nbsp; &nbsp; &nbsp; 访问控制列表处理过程<br>256&nbsp; &nbsp; &nbsp; &nbsp; 连接、操作及其结果的统计数据<br>512&nbsp; &nbsp; &nbsp; &nbsp; 向客户端返回的结果的统计信息<br>1024&nbsp; &nbsp; &nbsp; &nbsp; 与shell后端的通信信息<br>2048&nbsp; &nbsp; &nbsp; &nbsp; 显示记录条目的分析信息<br>4096&nbsp; &nbsp; &nbsp; &nbsp; 数据库缓存处理信息<br>8192&nbsp; &nbsp; &nbsp; &nbsp; 数据库索引<br>16384&nbsp; &nbsp; &nbsp; &nbsp; 从服务器数据同步资源消耗处理信息<br><br>若要记录所有的debug日志，可以使用LOG_LEVEL4 syslogd系统日志来记录，这需要在slapd.conf中添加如下语句实现：<br><br>local4.debug&nbsp; &nbsp; &nbsp; &nbsp; /var/log/slapd.log<br><br>2. 为BDB后端数据库实例指定在内存中的缓存空间大小<br><br>在如下句子后<br>DBDirectory:&nbsp; &nbsp; &nbsp; &nbsp; /usr/local/openldap/var/openldap-data<br>后添加：<br>DBCachesize: 2000<br><br>3. 访问控制列表:<br><br>3.1 语法<br><br>access to &lt;what&gt;[by &lt;who&gt; &lt;access&gt; &lt;control&gt;]+<br><br>其中,access to指示启用访问控制，上句大致可以理解为:<br>access to &lt;对什么目标进行控制&gt;[by &lt;作用于哪些访问者&gt; &lt;授予什么样的访问权限&gt;&lt;采取什么样的匹配控制动作&gt;]+<br><br><br>3.2 剖析<br><br>3.2.1 控制目标&lt;what&gt;<br><br>这一域主要是实现对ACL应用对象的指定，对象可以是记录和属性。选择ACL目标记录的方法一般有两种：DN和filter,语法为：<br><br>&lt;what&gt; ::= * |<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [dn[.&lt;basic-style&gt;]=&lt;regex&gt; | dn.&lt;scope-style&gt;=&lt;DN&gt;]<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [filter=&lt;ldapfilter&gt;] [attrs=&lt;attrlist&gt;]<br>3.2.1.1 指定所有的记录<br><br>access to *<br><br>3.2.1.2 通过DN指定<br><br>语法如下：<br><br>to dn[.&lt;basic-style&gt;]=&lt;regex&gt;<br>&lt;basic-style&gt; ::= regex | exact<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>to dn.&lt;scope-style&gt;=&lt;DN&gt;<br>&lt;scope-style&gt; ::= base | one | subtree | children<br><br>第一种方法是使用正则表达式(dn.regex)或精确匹配(dn.style)的方式来匹配符合条件的记录（这个好像不像想象的那么简单，实现起来颇为费脑筋），例如：<br><br>access to dn="^.*,uid=([^,]+),ou=users,(.*)$"<br><br><br>第二种方法通过&#8220;区域&#8221;选择的方法进行目标记录的选取，对以指定的DN开始的目录树区域进行目标记录匹配。匹配区域的方式共有四种：<br>base&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 只匹配DN本身一条记录<br>one&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 匹配以给定DN为父目录的所有记录<br>subtree&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 匹配以给定DN为根目录的所有子树内的记录<br>children&nbsp; &nbsp; &nbsp; &nbsp; 匹配给定DN下的所有记录，但应该不包括以DN直接命名的那条记录(参见例子的解释)<br><br>例如：对于<br><br>0: dc=mydomain,dc=org<br>1: cn=root,dc=mydomain,dc=org<br>2: ou=users,dc=mydomain,dc=org<br>3: uid=samba,ou=users,dc=mydomain,dc=org<br>4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org<br>5: uid=guest,ou=users,dc=mydomain,dc=org<br><br>规则 dn.base="ou=users,dc=mydomain,dc=org" 只会匹配记录2<br>规则 dn.one="ou=users,dc=mydomain,dc=org" 匹配记录3和记录5，记录4是记录3的子目录，故不算在内<br>规则 dn.subtree="ou=users,dc=mydomain,dc=org" 匹配记录2、3、4、5<br>规则 dn.children="ou=users,dc=mydomain,dc=org" 匹配记录3、4、5,因为记录0、1和2都是以DN直接命名的，故不匹配<br><br>3.2.1.3 通过filter匹配记录<br><br>通过filter指定过滤规则进行记录过虑，语法如下：<br><br>access to filter=&lt;ldap filter&gt;<br><br>其中filter指定的为search的过滤规则，这类同于linux系统中grep的匹配方式。如：<br><br>access to filter=(objectClass=sambaSamAccount)<br><br>也可以结合使用DN和filter进行记录的匹配，例如：<br><br>access to dn.subtree="ou=users,dc=mydomain,dc=org" filter=(objectClass=posixAccount)<br><br>3.2.1.4 通过attrs选取匹配记录<br><br>语法:<br>attrs=&lt;attribute list&gt;<br><br>例如：<br>access to attrs=uid,uidNumber,gidNumber<br><br>也可以结合使用DN和attrs进行记录的匹配，例如：<br>access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid<br><br>3.2.2 被用来授权的访问者&lt;who&gt;的指定<br><br>指定被授权的用户范围的方法大致有以下几种：<br>*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 所有的访问者，包括匿名的用户<br>anonymous&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 非认证的匿名用户<br>users&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 认证的用户<br>self&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 目标记录的用户自身<br>dn[.&lt;basic-style&gt;]=&lt;regex&gt;&nbsp; &nbsp; &nbsp; &nbsp; 在指定目录内匹配正则表达式的用户<br>dn.&lt;scope-style&gt;=&lt;DN&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 指定DN内的用户<br><br>例如：<br>by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"<br><br>3.2.3 被授予的权限&lt;access&gt;<br><br>当选取好ACL作用的目标记录并选取好用户范围后，就该给这些用户授予他们应该得到的权限了。大致的权限(由低到高)有以下几类：<br>none&nbsp; &nbsp; &nbsp; &nbsp; 无权限，即拒绝访问<br>auth&nbsp; &nbsp; &nbsp; &nbsp; 访问bind（认证）设置的权限；前提是需要用户提交一个DN形式的用户名并能通过认证<br>compare&nbsp; &nbsp; &nbsp; &nbsp; 比较属性的权限；（例如：对照查看某用户的telephoneNumber值是不是158 8888 8888）,但并不具有搜索的权限<br>search&nbsp; &nbsp; &nbsp; &nbsp; 利用过虑条件进行搜索的权限,但这并不一定具有可读取搜索结果的权限<br>read&nbsp; &nbsp; &nbsp; &nbsp; 读取搜索结果的权限<br>write&nbsp; &nbsp; &nbsp; &nbsp; 更改记录属性值的权限<br><br>可以在slapd.conf文件中通过defaultaccess指定默认的权限级别,如：<br>defaultaccess&nbsp; &nbsp; &nbsp; &nbsp; search<br><br>3.2.4 采取什么样的匹配控制动作&lt;control&gt;<br><br>在进行记录的匹配时，如果有多条规则存在，那么在第一次匹配产生后是否还进行后续的匹配或采取其它的动作将取决于此项的设置；控制方式共有以下三种：<br><br>stop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 这个是默认值，这表示在一次匹配产生后将不再进行下一个匹配，所有后续的匹配将会停止。<br>continue&nbsp; &nbsp; &nbsp; &nbsp; 无论匹配是否已经发生，继续进行直到所有的规则全部进行完匹配检查<br>break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一个匹配发生后，跳出当前的子句进行后一个子句的检查<br><br>3.2.5 一个例子<br><br>access to dn.chilren="ou=users,dc=mydomain,dc=org"<br>&nbsp; &nbsp; attrs=userPassword&nbsp;&nbsp;#指定&#8220;密码&#8221;属性<br>&nbsp; &nbsp; by self write&nbsp; &nbsp;&nbsp; &nbsp; #用户自己可更改<br>&nbsp; &nbsp; by * auth&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#所有访问者需要通过认证<br>&nbsp; &nbsp; by dn.children="ou=admins,dc=mydomain,dc=org" write&nbsp;&nbsp;#管理员组的用户可更改<br><br>待续&#8230;&#8230;<br></span></span>
<img src ="http://www.blogjava.net/junky/aggbug/122361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 14:43 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[LDAP][翻译]OpenLDAP管理员指南(仅前七章) (转)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122343.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122343.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122343.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122343.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122343.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 序言 版权 Copyright 1998-2002, The OpenLDAP Foundation, All Rights Reserved. Copyright 1992-1996, Regents of the University of Michigan, All Rights Reserved 本文档是OpenLDAP项目的一部分。它遵从在OpenLDAP Software Copyri...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2007/06/06/122343.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/122343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 13:04 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运行OpenLdap(转)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122342.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122342.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122342.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122342.html</trackback:ping><description><![CDATA[<p><span><span>1、&nbsp;</span></span><span>安装</span><span>OpenLdap</span></p>
<p><span>比如装在</span><span>d:\openldap</span></p>
<p><span>
<p><br>2、了解ldap <a href="http://www.linuxaid.com.cn/engineer/brimmer/html/LDAP.htm">http://www.linuxaid.com.cn/engineer/brimmer/html/LDAP.htm</a><br>&nbsp;<br></p>
</span>
<p>&#160;</p>
<p><span><span>3、&nbsp;</span></span><span>修改</span><span>slap.conf</span></p>
<p><span>假设域名为：</span><span>netone.com</span></p>
<p><span>大概在</span><span>56</span><span>行</span></p>
<p><span>#######################################################################
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span># BDB database definitions</span><span>只要更改下面两个地方就可以了</span><span>,</span><span>注意</span><span>suffix</span><span>和</span><span>rootdn</span><span>的</span><span>dc</span><span>要相同</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>#######################################################################
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>database&nbsp;bdb</span></p>
<p><span>#</span><span>新的值</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>suffix<span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"dc=netone,dc=com"<span>&nbsp;&nbsp; </span></span></p>
<p><span>#</span><span>原来的值</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>#suffix<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"dc=my-domain,dc=com"<span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span>#</span><span>新的值</span><span><span>&nbsp;&nbsp;&nbsp; </span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>rootdn<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"cn=Manager,dc=netone,dc=com" </span></p>
<p><span>#</span><span>原来的值</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>#rootdn<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"cn=Manager,dc=my-domain,dc=com" </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span><span>4、&nbsp;</span></span><span>写</span><span>domain.ldif</span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>dn:dc=netone,dc=com
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>objectclass:dcObject
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>objectclass:organization
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>o:companyinfo
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>dc:netone</span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>保存在安装的目录下</span><span>,</span><span>即</span> <span>d:\openldap</span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span><span>5、&nbsp;</span></span><span>运行</span></p>
<p><span>命令行</span> <span>到达</span> <span>d:\openldap</span></p>
<p><span>然后输入命令（</span><span>增加配置）</span><span>：</span><span><span>slapadd -f slapd.conf -l domain.ldif
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>接着输入命令（启动</span></span><span><span>ldap</span></span><span><span>服务）：</span></span><span><span>slapd -d 1
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>如果最后几行有</span></span><span><span> <span>starting </span></span></span><span><span>就说明运行成功。</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>
<p>&nbsp;</p>
</span></span>
<p>&#160;</p>
<p><span><span><span>6、<span> </span></span></span></span><span><span>查看</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>可以通过</span></span><span><span>jxplorer</span></span><span><span>（</span></span><span><span>下载地址：</span></span><span><span><a href="http://pegacat.com/jxplorer/">http://pegacat.com/jxplorer/</a></span></span><span><span>）来查看目录结构。</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>运行</span></span><span><span>jxplorer,</span></span><span><span>点击左上角的（类似连接）图标，配置</span></span><span><span>ldap</span></span><span><span>的连接参数</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>第一二行可以不改。</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>Base DN:</span></span><span><span>输入我们的域名：</span></span><span><span>dc=netone.com
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>Level</span></span><span><span>为匿名</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span>按钮</span></span><span><span> <span>OK</span></span></span><span><span>，如果能连接成功，那么恭喜你。</span></span></p>
<p><span></span></p>
<span><span>
<p>
<p><font size=3><span><span>另外也可以用</span></span><span><span> LDAP Browser/Editor (<a href="http://www-unix.mcs.anl.gov/~gawor/ldap/download.html"><span><span>下载</span></span>l</a> ) </span></span><span><span>来查看，</span></span><span><span>
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p><font size=3><span><span>解压后运行：</span></span><span><span>lbe.bat
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p><font size=3><span><span>然后连接</span></span><span><span>ldap</span></span><span><span>服务器</span></span><span><span>(</span></span><span><span>刚运行时有</span></span><span><span>quickConnect,</span></span><span><span>或</span></span><span><span>File-&gt;connect)
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p><font size=3><span><span>填写参数：</span></span><span><span>Host:localhost
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p><span><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;Port:386
<p>&#160;</p>
</font></span></span>
<p>&#160;</p>
<p><span><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;Version:3
<p>&#160;</p>
</font></span></span>
<p>&#160;</p>
<p><span><span><font size=3><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;BaseDN:dc=netone,dc=com
<p>&#160;</p>
</font></span></span>
<p>&#160;</p>
<p><span><span><font size=3>最后按按钮啦。成功！</font></span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p>&nbsp;</p>
<p>&#160;</p>
</span></span>
<p><span><span>本文是参照：</span></span><span><span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><span><a href="http://www.cjsdn.net/post/view?bid=11&amp;id=90353&amp;sty=3&amp;age=0&amp;tpg=1&amp;ppg=1#90353">http://www.cjsdn.net/post/view?bid=11&amp;id=90353&amp;sty=3&amp;age=0&amp;tpg=1&amp;ppg=1#90353</a>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span><a href="http://www.cjsdn.net/post/view?bid=11&amp;id=90367&amp;sty=3&amp;age=0&amp;tpg=1&amp;ppg=1#90367">http://www.cjsdn.net/post/view?bid=11&amp;id=90367&amp;sty=3&amp;age=0&amp;tpg=1&amp;ppg=1#90367</a>
<p>&#160;</p>
</span>
<p>&#160;</p>
<span>
<p><span><a href="http://www.ldapchina.com/"><font size=3>http://www.ldapchina.com</font></a>
<p>&#160;</p>
</span></span>
<img src ="http://www.blogjava.net/junky/aggbug/122342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 13:02 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习LDAP的过程(转)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122339.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122339.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122339.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122339.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; 写这篇文章，是因为，最近学习了LDAP的相关知识，因为整个学习过程都与网络有关，大量的文献资料都是从网上下载下来的。现将，我学习LDAP的过程简要列出来，目的是想为那些还没有接触和掌握LDAP的人来说，能够节约大量的时间和精力。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>1、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp;<span style="FONT-SIZE: 14pt"> LDAP</span></font><span style="FONT-SIZE: 14pt">的英文的意思我是早就接触，只是了解，并不深入，所以，这次想多了解一些，于是从网上下载了大量的资料，从理论上了解LDAP是怎么回事，如什么是LDAP？什么是X.500？X.500与LDAP是什么关系？X.500与X.509？什么是DN等，大家在网上输入关键字LDAP可以搜索到很多的相关的资料。</span></span></span>LDAP</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>2、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>光说不练不行，还得找一找软件，我所知道的，提供LDAP目录服务的软件有IBM domino，SUN 提供的软件，以及开源的OPENLDAP，而我手头没有安有LINUX操作系统的机器，所以，软件最好能在windows server 2003上运行。安装要简单，配置最好也要简单。于是，我从网上下载了openldap for win32的安装包。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>3、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>安装过程很顺利，安装好后，用netstat &#8211;an 查看，LDAP服务的389端口处于正常的侦听状态，说明服务正常启动了。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>4、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>根据下载的文档，修改slapd.conf配置文件，将MY-DOMAIN改为自已设定的名称，如ydzy。样例文件如下：</p>
<p>database&nbsp;bdb</p>
<p>suffix<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dc=ydzy,dc=com"</span></p>
<p>rootdn<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "cn=Manager,dc=ydzy,dc=com"</span></p>
<p># Cleartext passwords, especially for the rootdn, should</p>
<p># be avoid.&nbsp;See slappasswd(8) and slapd.conf(5) for details.</p>
<p># Use of strong authentication encouraged.</p>
<p>rootpw<span>&nbsp;&nbsp;&nbsp; secret</span></p>
<p># The database directory MUST exist prior to running slapd AND </p>
<p># should only be accessible by the slapd and slap tools.</p>
<p># Mode 700 recommended.</p>
<p>directory<span> ./data</span></p>
<p># Indices to maintain</p>
<p>index<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objectClass&nbsp;&nbsp;&nbsp;&nbsp; eq</span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>5、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>然后，按照OPENLDAP快速帮助的说明，自已制作了根DN的ydzy.ldif文件。</p>
<p>dn: dc=ydzy,dc=com</p>
<p>objectclass: dcObject</p>
<p>objectclass: organization</p>
<p>o: Example Company</p>
<p>dc: ydzy</p>
<p>&nbsp;</p>
<p>dn= cn=Manager,dc=ydzy,dc=com</p>
<p>objectclass: organizationalRole</p>
<p>cn: Manager</p>
<p>这里要说明一下，由于本人下载的LDAP文档，绝大部分都是针对LINUX环境，提供的添加条目到LDAP目录服务器的命令是LINUX环境下的，所以，照抄时，总是不对。在WINDOWS命令行状态，要用双引号来括住一些信息。如上面的添加条目信息的命令为：</p>
<p>Ldapadd &#8211;x &#8211;D &#8220;cn=Manager,dc=ydzy,dc=com&#8221; &#8211;w secret &#8211;f ydzy.ldif</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>6、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>在设定了最基本的条目后，我试着从VB工程中，用LDAP的ACTIVEX控件来连接LDAP服务器，无论在connect函数中怎么设定，就是报协议错，为此，花费了我不少时间和精力，我是在VB6中，通过AXLDAP控件连接OPENLDAP服务器的。这当中，最大的问题，就是LDAP服务器的管理员用户名和口令是什么。尽管后来才知道，不是连接LDAP服务器的用户名与口令不正确，而是控件不支持我所安装的OPENLDAP服务器的版本所致。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>7、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>尽管，OEPNLDAP提供了命令行的ldapsearhc工具，但对初学者来讲，仍然，不形象直观，于是，上网搜索，从http://www.ldapadministrator.com/下载了windows版的ldap客户端软件。这真是个好东西，下载下来，安装好后，进行简单的设置，那个OPENLDAP里面的内容就展现在我面前了。友情提醒一下，最好在下载OPENLDAP的时侯，就下载相应的客户端工具，这对于学习和理解LDAP的相关知识很有好处的，本人就是通过这款软件才迅速解决了许多问题。例如，前面所说的用户名/口令的问题，因在该软件中，要连接LDAP服务器，必须提供相应的用户名和口令，于是，我就试着填入相应的用户名和口令，终于明白，slapd.conf文件中的rootdn后面的一长串就是管理员的用户名，而rootpw后的明文secret就是管理员的密码，所以，象命令中的-D &#8220;cn=Manager,dc=ydzy,dc=com&#8221; &#8211;w secret 就是通常的用户名和口令的格式。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>8、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>前面，我们刚学会添加根DN的方法，在实际应用中，需要添加各种各样的信息到LDAP中，而要添加信息，必须掌握写作LDIF文件的方法，具体的LDIF的格式要求，从下载的文档，大家可以看到。我根据一篇文档的介绍，将公司员工的邮件地址存入LDAP服务器，以便于在OUTLOOK等工具中可以查询。于是，我编写了以下格式的文件：</p>
<p>dn: cn=lxj,dc=ydzy,dc=com</p>
<p>objectclass: inetorgPerson</p>
<p>cn: lxj</p>
<p>cn: luoxiaojun</p>
<p>sn: luo</p>
<p>mail: lxj@192.1.3.211</p>
<p>&nbsp;</p>
<p>dn: cn=lxr,dc=ydzy,dc=com</p>
<p>objectclass: inetorgPerson</p>
<p>cn: lxr</p>
<p>cn: lixinyue</p>
<p>sn: li</p>
<p>mail: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#120;&#114;&#64;&#49;&#57;&#50;&#46;&#49;&#46;&#51;&#46;&#50;&#49;&#49;"><u><font color=#0000ff>lxr@192.1.3.211</font></u></a></p>
<p>就是向目录服务器，添加两个条目。</p>
<p>然后，就用ldapadd 命令向目录服务器加，始终报语法错误，这是怎么回事呢？左看右看，这时，我通过LDAP客户端软件，查看其中的模式，发现没有inetorgperson这个模式，于是我想到，是否，应在slapd.conf中将相关的模式文件包含进来，于是打开slapd.conf文件，发现，默认的配置文件中，只有一个core.schema包含了进来，而在openldap的安装文件夹下，可以看到schema文件夹，于是，将相应的inetorgperson模式文件添加到slapd.conf文件中。重启openldap服务器，再运行添加条目的命令，成功，通过LDAP客户端工具，可以看到，几条信息已经成功地添加到LDAP服务器中。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>9、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp; </font></span></span>我在网上，也看到一些文章讲LDAP应用面变窄的问题，其实，我们通过PKI，通过LDAP，我们发现，国外，似乎在追求一种基础架构，即公共，标准，安全。LDAP中能存储的在关系统数据库基本上都可以存储，但关系数据库无法做到作为一种公共设施，轻便，便于实施，所以，从追求标准化来看，LDAP将来将是信息基础构件，就象家里用的灯泡一样，而不是应用越来越窄，相反，会得到很广的应用。比如，微软的activedirectory活动目录，不就是一个例证吗？</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>10、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span>通过X.500或LDAP的条目DN可以和X.509数字证书绑定在一起，便于用户的查询。这种应用是较好的一种组合。</p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><span>11、<span style="FONT: 7pt 'Times New Roman'"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="FONT-SIZE: 14pt">服务器提供了主从服务器的复制功能，确保了LDAP的稳定性和可靠性，实现起来也很容易。</span></span></span>LDAP</p>
<img src ="http://www.blogjava.net/junky/aggbug/122339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 13:01 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openldap for win32 安装程序制作分析 相关参考资料与研究(转)</title><link>http://www.blogjava.net/junky/archive/2007/06/06/122336.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 06 Jun 2007 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/06/122336.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122336.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/06/122336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122336.html</trackback:ping><description><![CDATA[<p>openldap for win32</p>
<p>(<a href="http://lucas.bergmans.us/hacks/openldap/">http://lucas.bergmans.us/hacks/openldap/</a>)这是主要来源资料文档。</p>
<h2>Download</h2>
<h3>Binary Distributions</h3>
<p><a href="http://download.bergmans.us/openldap/">http://download.bergmans.us/openldap/</a></p>
<h3>Developer Documentation/Patches</h3>
<p><a href="http://download.bergmans.us/openldap/devel/">http://download.bergmans.us/openldap/devel/</a>（老外的编译开发资源包）</p>
<p><a href="http://www.jrsoftware.org/">http://www.jrsoftware.org/</a>（安装程序Inno Setup下载地址）</p>
<p><a href="http://www.sleepycat.com/">http://www.sleepycat.com/</a>（openldap使用的Berkeley DB）</p>
<pre>Please note that if you have a server in production using aSleepycat/Berkeley DB backend (which is the default), then you willnot want to cut over to an OpenLDAP build that uses a different BDBversion until you have thoroughly tested the change.  If you havea build from me that doesn't specify a bdb version in the filename,then the version used was 4.2.52.Also, there has been talk on openldap-software that bdb-4.3 stillhas some non-trivial bugs, so proceed at your own risk.  -- Lucas Bergman &lt;lucas@bergmans.us&gt;     2004-12-10</pre>
<p>&#160;</p>
<div id=main>
<h2>Getting Started</h2>
<p>I'm working on installation documentation at the same time as a better release. In the meantime, there is some documentation on getting my current port working under Windows in <a href="http://mguessan.free.fr/nt/openldap.html">French</a> and <a href="http://mguessan.free.fr/nt/openldap_en.html">English</a> (endless thanks to <a href="http://mguessan.free.fr/">Micka&#235;l Guessant</a>).</p>
<h2>FAQ</h2>
<ol>
    <li>
    <p><strong>Where can I download the OpenLDAP software for Windows?</strong></p>
    <p>Use the &#8220;download&#8221; link on the left side of this page.</p>
    <li>
    <p><strong>I've downloaded the software and installed it, and everything seems okay. Now what do I do?</strong></p>
    <p>Start with <a href="http://mguessan.free.fr/">Micka&#235;l Guessant</a>'s getting started documentation (in <a href="http://mguessan.free.fr/nt/openldap.html">French</a> and <a href="http://mguessan.free.fr/nt/openldap_en.html">English</a>), and then start learning something.</p>
    <li>
    <p><strong>Will you help me use OpenLDAP with my mail client?</strong></p>
    <p>That, and other questions that have nothing to do with the running OpenLDAP on Windows in particular, should be directed to the <a href="http://www.openldap.org/">official OpenLDAP forums</a>. The answers you get will be better, and the time you save will be your own.</p>
    <li>
    <p><strong>How can I build OpenLDAP for myself?</strong></p>
    <p>Right now, the scripts I use to build the software are stored in <a href="http://download.bergmans.us/openldap/devel/">a subdirectory of the download site</a>. However, I've moved things to CVS, so be prepared to deal with that.</p>
    <li>
    <p><strong>I see your build uses the <a href="http://www.mingw.org/">MinGW</a> build of the <a href="http://www.gnu.org/">GNU</a> toolchain. How can I build with the Microsoft toolchain (e.g., Microsoft Visual C++ .NET 2008 Enterprise .COM Visual .ORG Special Edition Service Pack 9)?</strong></p>
    <p>I don't care. I have no interest in using proprietary tools when <a href="http://www.gnu.org/philosophy/free-sw.html">free</a> ones will produce the exact same result.</p>
    <p><strong>But it's for my <em>job</em>! My company has a <em>policy</em> that we use only Microsoft tools! My boss won't let me use your hippie compiler.</strong></p>
    <p>Since it's for your job, I'm sure your company won't mind paying me a consulting fee to get the thing working with the proprietary toolchain of your choice.</p>
    <li>
    <p><strong>Do you have the SQL backend? I'd like to have OpenLDAP use an RDBMS as a storage medium.</strong></p>
    <p>We don't yet, since it was only relatively recently that we've gotten modern versions of the server working in an easily installed package. This is a common request, and I swear we're working on it.</p>
    <li>
    <p><strong>If my question isn't here, can I email you?</strong></p>
    <p><a href="http://lucas.bergmans.us/hacks/openldap/questions">Talk to the list.</a></p>
    </li>
</ol>
</div>
<hr>
<p>上面主要是第六条需要注意一下数据库的使用问题。</p>
<p><a href="http://www.mingw.org/">http://www.mingw.org/</a>（这个暂时不清楚是做什么用的）</p>
<p><a href="http://www.gnu.org/home.cn.html">http://www.gnu.org/home.cn.html</a>（开源自由软件协议公约）</p>
<p>&#160;</p>
<p>下面是一位兄弟自己编译的windows版本过程。</p>
<p><strong><span>Windhue&#8217;s homepage </span></strong><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>OpenLDAP for win32 编译过程举例
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><strong><span>
<p>&nbsp;</p>
</span></strong>
<p>&#160;</p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong>环境</strong><span>: WinXP Pro sp2; Visual C++ 6。 </span></p>
<p><strong>目标</strong>：编译<span> openldap 的 debug 版本。 </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>1. </span></strong><city></city>
<place></place>
<city>
<place><strong><span>Berkeley</span></strong></place>
</city><strong><span> DB
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>- 得到 db-4.1.24.tar.gz。可在网上google一下，例如，目前点击 <a href="http://custom.lab.unb.br/pub/database/db/db-4.1.24.tar.gz">这里 </a>可以下载。</span></p>
<p><span>&nbsp;更新版本的，应该也没有问题，但是我没有测试。 </span></p>
<p><span>- 解压到某个文件夹。例如 F:\db-4.1.24。 </span></p>
<p><span>- 阅读 F:/db-4.1.24/docs/ref/build_win/intro.html </span></p>
<p><span>- F:\db-4.1.24\build_win32\Berkeley_DB.dsw ，用VC打开它。 </span></p>
<p><span>- 将&#8220;build all - Win32 Debug&#8221;设置为活动工程。 </span></p>
<p><span>- rebuild all </span></p>
<p><span>&nbsp;生成的文件位于 F:\db-4.1.24\build_win32\Debug和 </span></p>
<p><span>&nbsp;F:\db-4.1.24\build_win32\Debug_Static。我需要的是前者。 </span></p>
<p><span>- libdb41d.lib拷贝到VC的lib目录。 </span></p>
<p><span>- libdb41d.dll拷贝到系统目录。 </span></p>
<p><span>- copy db.h to {VC's include path} </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>2. Cyrus SASL
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>- 解压 <a href="http://windhue.home4u.china.com/cyrus-sasl-2.1.15.rar">cyrus-sasl-2.1.15.rar </a>到 F:\cyrus-sasl-2.1.15 </span></p>
<p><span>- 阅读 file:///F:/cyrus-sasl-2.1.15/doc/windows.html </span></p>
<p><span>- cd F:\cyrus-sasl-2.1.15\lib </span></p>
<p><span>- {VC's path}\VC98\Bin\vcvars32.bat
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>&nbsp;nmake /f NTMakefile CFG=Debug
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>- libsasl.lib </span>拷贝到<span> VC </span>的<span> lib </span>目录。<span> <span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>&nbsp;libsasl.dll </span>拷贝到系统目录。<span> <span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>- copy sasl.h<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{VC's include path}\sasl.h </span></p>
<p><span>&nbsp;copy prop.h<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{VC's include path}\prop.h </span></p>
<p><span>&nbsp;copy saslplug.h<span>&nbsp;&nbsp; </span>{VC's include path}\sasl\saslplug.h </span></p>
<p><span>&nbsp;copy md5global.h {VC's include path}\sasl\md5global.h </span></p>
<p><span>&nbsp;copy md5.h<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{VC's include path}\sasl\md5.h </span></p>
<p><span>&nbsp;copy hmac-md5.h<span>&nbsp;&nbsp; </span>{VC's include path}\hmac-md5.h </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>3. hs_regex
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>- 下载 <a href="http://windhue.home4u.china.com/hs_regex.exe">hs_regex.exe </a>自解压文件。 </span></p>
<p><span>&nbsp;把文件拷贝到相应的目录。hs_regex.dll regex.h hs_regex.lib </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>4．openssl
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>- 我用的是<a href="http://www.openssl.org/source/openssl-0.9.7b.tar.gz">openssl-0.9.7b</a>。在windows下的编译过程不赘述。参考<a href="http://www.openssl.org/">http://www.openssl.org/</a> <a href="http://openssl.cn/">http://openssl.cn/</a> 。</span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>5. openldap
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>- 解压 openldap-*.*.**.rar。点击 <a href="http://windhue.home4u.china.com/openldap_2.2.18_win32.rar">这里 </a>下载。 </span></p>
<p><span>- 打开build/main.dsw </span></p>
<p><span>- 将&#8220;build - Win32 Debug&#8221;设置为活动工程。看一下 readme.txt。 </span></p>
<p><span>- build&#8220;build - Win32 Debug&#8221;。&nbsp;</span></p>
<p><span>- 将slapd设置为活动工程。运行 slapd 。参考 slapd 项目下的 readme.txt。 </span></p>
<p><span>- ldapadd之后，可能重启一下slapd才能看到变化。 </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>6. LDAP Browser/Editor
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>&nbsp;一个java的ldap客户端浏览器。点击 <a href="http://www-unix.mcs.anl.gov/~gawor/ldap/">这里 </a>下载。 </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong>注意 </strong>：<span> slurpd由于包含一些linux的符号，还没移植到win32。主要是一些与文件操作相关的函数和宏定义。移植应该不会十分困难。至于openldap在win32平台上的性能问题，这里不做讨论。 </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>windhue@sina.com </span></p>
<p><span>2004-11-23 </span></p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><span>/* END */ </span></p>
<img src ="http://www.blogjava.net/junky/aggbug/122336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-06 12:58 <a href="http://www.blogjava.net/junky/archive/2007/06/06/122336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关LDAP协议的整理(转)</title><link>http://www.blogjava.net/junky/archive/2007/06/04/121754.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 04 Jun 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/04/121754.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/121754.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/04/121754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/121754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/121754.html</trackback:ping><description><![CDATA[<p>LDAP的英文全称是Lightweight Directory Access Protocol,即轻量级目录访问协议.我们知道,人们对计算机网络的使用和管理涉及了各种庞杂的资源,信息.为了提高性能,便于使用,有效管理分布式应用的服务,资源,用户及别的对象信息,这些信息需要清晰,一致地组织起来.基于这样的需求,描述各种用户,应用,文件,打印机和其它可从网络访问的资源的信息被集中到一个特殊的数据库中,这种数据库被称为目录.目录存放对象的公开或非公开的信息,这些信息以某种顺序组织,描述了每个对象的细节.电话簿,图书馆藏书卡片目录就是常见的目录. LDAP是基于X.500标准的,访问 X.500 目录需要某种协议,例如:目录访问协议 (DAP).然而,DAP 需要大量的系统资源和支持机制来处理复杂的协议.LDAP 仅通过使用原始 X.500目录存取协议 (DAP) 的功能子集而减少了所需的系统资源消耗,而且可以根据需要定制.此外,与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的. 为了能对LDAP协议进行更好的理解,我们需要对以下概念有初步的认识:目录:Directory,存放对象的信息,这些信息以某种顺序组织,详细描述每个对象.目录信息树:DIT,Directory Information Tree,目录条目的集合构成了目录信息树.条目:Entry,目录信息树中的一个结点,是一个对象信息的集合,是目录信息中最基本的单位,包含该对象的一系列属性.属性:Attribute,属性描述对象的特征.一个属性由属性类型(type)和一个或多个属性值(values)构成.相对标识名:RDN,Relative Distinguished Name,条目的名字.唯一标识名:DN,Distinguished Name,在一个目录信息树中唯一标识一个条目的名字. LDAP（轻量级目录访问协议，Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。 目录服务是一种特殊的数据库系统，其专门针对读取，浏览和搜索操作进行了特定的优化。目录一般用来包含描 述性的，基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的 复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、 jpeg图像等各种信息。为了访问存储在目录中的信息，就需要使用运行在TCP/IP之上的访问协议—LDAP。 </p>
<p>LDAP目录中的信息是是按照树型结构组织，具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中 表的记录；条目是具有区别名DN（Distinguished Name）的属性（Attribute），DN是用来引用条目的，DN相当于 关系数据库表中的关键字（Primary Key）。属性由类型（Type）和一个或多个值（Values）组成，相当于关系数 据库中的字段（Field）由字段名和数据类型组成，只是为了方便检索的需要，LDAP中的Type可以有多个Value， 而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置 和组织关系进行组织，非常的直观。LDAP把数据存放在文件中，为提高效率可以使用基于索引的文件数据库，而不 是关系数据库。类型的一个例子就是mail，其值将是一个电子邮件地址。 </p>
<p>WebLogic的内置的LDAP Server支持IETF LDAP为LDAPv3制定的控制访问模型。下面这个片断将讲述在内置的LDAP Server中怎样实现控制访问。可以通过编辑访问控制文件来将这些规则直接应用到目录的入口。WebLogic中的访问控制文件是acls.prop。在Server的lib中可以找到这个文件。这个文件的所有访问控制规则都被注释掉了，如果想更改这些规则，你要手工更改这个文件。注意：WebLogic Server内置的LDAP Server在默认的情况下只允许Admin帐号访问，WebLogic Server的security providers只使用Admin帐号访问内置的LDAP Server。如果你不想使用外部的LDAP Brower访问WebLogic Server的内置的LDAP Server，或者你只想使用Admin帐号访问内置的LDAP Server，你不需要编辑acls.prop文件，访问控制文件（The Access Control File）</p>
<p>访问控制文件（acls.prop）包含内置的LDAP Server的整个目录的完整的访问控制列表（ACL）。这个文件中的每一行都包含一个访问控制规则。一个访问控制规则由下面接个部分组成： 访问控制位置(Access Control Location) 每个访问控制规则都应用于LDAP目录中的一个给定的位置。这个位置通常是一个区别命名（DN），但有一个例外，这就是[root]，如果访问控制规则应用到整个目录，则只需要指定位置为[root]就可以了！ 如果被访问或更改的入口的位置与访问控制规则指定的位置不相等，或在访问控制规则指定的位置的下级，则这个访问控制规则将不会被执行。</p>
<p>访问控制范围（Access Control Scope） 访问控制范围有2种： Entry-一个Entry范围的访问控制列表只在下面的情况下被执行： LDAP目录的入口的DN与访问控制规则指定的位置相同。这样的规则对于包含了比并行和副入口更敏感信息的单独入口非常有用。 Subtree-意味着访问控制规则指定的位置及子树都可以适用这条规则。 如果Entry与Subtree在访问控制规则中有冲突，则Entry要优先于Subtree。</p>
<p>访问权限（Access Rights） 访问权限应用于整个对象或对象的属性，有2个值：grant（准许）或deny（拒绝）。访问权限指定了LDAP操作的类型。 许可(grant或deny)</p>
<p>应用规则的属性(attribute)</p>
<p>允许或拒绝访问的主题(subject) 在weblogic可以编写程序来访问LDAP.上手时可以选择JXplorer工具。 1.LDAP Server及LDAP Browser： 对于WLS LDAP为理解起来简单，去掉限制的方法是修改bea\weblogic81\server\lib\acls.prop文件后。修改方法：在该文件最后添加以下几行。[root]|entry#grant:s,r,o,w,c,m#[all]#public[root]|subtree#grant:s,r,o,w,c,m#[all]#public:[root]|subtree#grant:a,d,e,i,n,b,t#[entry]#public:cn=schema|entry#grant:s,r,o,w,c,m#[all]#public:cn=schema|entry#grant:a,d,e,i,n,b,t#[entry]#public:注意，该文件中这些行之间，以及其他行之间不能有空行，否则启动WLS会报错的。修改好之后就可以启动WLS了，启动后进入Console里修改Ldap Server的密码。密码修改完后需要再重新启动一次WLS。</p>
<br>
<p>LDAP刚上手的时候没有方便的工具会很费劲。我看了CSDN上&#8220;兔八哥&#8221;的文章，用JXplorer，感觉很不错。想看这篇文章，到CSDN上搜一下&#8220;兔八哥&#8221;，系列中No.12就是关于JXplorer的配置和使用。我的连接参数如下：Host:localhost//根据实际修改Port:7001Protocol:LDAP v3Base DN:dc=ldapdomain//根据实际修改Level:User PasswordUser DN:cn=AdminPassword:weblogic//根据实际修改.编程操作LDAP Server。 下面四个JAVA方法，分别用于初始化，查询，添加，删除，修改，关闭连接。 记得每次都需要先大概连接，操作，然后关闭连接。和使用数据库差不多。 首先是需要用到的头文件：import java.util.Hashtable;import java.util.Enumeration;import javax.naming.Context;import javax.naming.NamingException;import javax.naming.directory.DirContext;import javax.naming.directory.InitialDirContext;import javax.naming.directory.SearchControls ;import javax.naming.NamingEnumeration;import javax.naming.directory.SearchResult;import javax.naming.directory.Attributes ;import javax.naming.directory.Attribute;import javax.naming.directory.BasicAttributes;import javax.naming.directory.BasicAttribute;import javax.naming.directory.ModificationItem;import java.lang.reflect.Method;import java.io.BufferedReader;import java.io.InputStreamReader;</p>
<p>然后是一个类域，用于保存上下文： DirContext ctx = null; 然后是初始化： public void init(){ String account="Admin";//操作LDAP的帐户。默认就是Admin。 String password="weblogic";//帐户Admin的密码。 String root="dc=ldapdomain"; //所操作的WLS域。也就是LDAP的根节点的DC Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");//必须这样写，无论用什么LDAP服务器。 env.put(Context.PROVIDER_URL, "ldap://localhost:7001/" root);//LDAP服务器的地址:端口。对WLS端口就是7001 env.put(Context.SECURITY_AUTHENTICATION, "none");//授权界别，可以有三种授权级别，但是如果设为另外两种都无法登录，我也不知道为啥，但是只能设成这个值"none"。 env.put(Context.SECURITY_PRINCIPAL, "cn=" account "," root);//载入登陆帐户和登录密码 env.put(Context.SECURITY_CREDENTIALS, password); try{ ctx = new InitialDirContext(env);//初始化上下文 System.out.println("认证成功");//这里可以改成异常抛出。 }catch(javax.naming.AuthenticationException e){ System.out.println("认证失败"); }catch(Exception e){ System.out.println("认证出错：" e); } }</p>
<p>查询操作： public void search(){//我只能按照某些属性查找节点，偶还不会怎么查找一个目录或按照更复杂的正则式查找特定节点／目录 try{ SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); System.out.print("what would you want to search:"); BufferedReader bd=new BufferedReader(new InputStreamReader(System.in)); String s=bd.readLine(); NamingEnumeration en = ctx.search("", "uid=" s, constraints); //要查询的UID。如果是*则可以查到所有UID的节点 if(en == null){ System.out.println("Have no NamingEnumeration."); } if(!en.hasMoreElements()){ System.out.println("Have no element."); } while (en != null &amp;&amp; en.hasMoreElements()){//可以查出多个元素 Object obj = en.nextElement(); if(obj instanceof SearchResult){ SearchResult si = (SearchResult) obj; System.out.println("\tname: " si.getName()); Attributes attrs = si.getAttributes(); if (attrs == null){ System.out.println("\tNo attributes"); }else{ for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();){//获得该节点的所有属性 Attribute attr = (Attribute) ae.next();//下一属性 String attrId = attr.getID();//获得该属性的属性名 for (Enumeration vals = attr.getAll();vals.hasMoreElements();){//获得一个属性中的所有属性值 System.out.print("\t\t" attrId ": "); Object o = vals.nextElement();//下一属性值 if(o instanceof byte[]) System.out.println(new String((byte[])o)); else System.out.println(o); } } } } else{ System.out.println(obj); } System.out.println(); } }catch(Exception e){ System.out.println("Exception in search():" e); } } 添加操作： public void add(){ try{ String newUserName = "stella"; BasicAttributes attrs = new BasicAttributes(); BasicAttribute objclassSet = new BasicAttribute("objectclass"); objclassSet.add("person"); objclassSet.add("top"); objclassSet.add("organizationalPerson"); </p>
<p>objclassSet.add("inetOrgPerson"); objclassSet.add("wlsUser"); attrs.put(objclassSet); attrs.put("sn", newUserName); attrs.put("uid", newUserName); attrs.put("cn", newUserName); ctx.createSubcontext("uid=" newUserName ",ou=people,ou=myrealm", attrs); //添加一个节点，我还不会添加目录 }catch(Exception e){ System.out.println("Exception in add():" e); } }</p>
<p>修改操作： public void edit(){ try{ String account = "stella";//修改以前旧的值 String sn = "stella sn";//修改以后新的值 ModificationItem modificationItem[] = new ModificationItem[1]; modificationItem[0] = new ModificationItem( DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", sn));//所修改的属性 ctx.modifyAttributes("uid=" account, modificationItem); //执行修改操作 }catch(Exception e){ System.out.println("Exception in edit():" e); } }</p>
<p>删除节点操作： public void delete(){ try{ String uid = "stella"; ctx.destroySubcontext("uid=" uid); //按照UID删除某个节点。我还不会删除一个目录。 }catch(Exception e){ System.out.println("Exception in edit():" e); } }</p>
<p>关闭连接： public void close(){ if(ctx != null) { try { ctx.close(); } catch (NamingException e) { System.out.println("NamingException in close():" e); } } }我对LDAP的理解：它是用于对资源的管理和服务的访问协议，在Weblogic平台上的JNDI（包含EJB和DataSource)都是提供它来提供的。正是JNDI的服务和RMI结合就形成J2EE平台上分布式的应用，因此说到底层，还是LDAP协议的支持。</p>
<p>部分资料参考：http://www.blogjava.net/kapok/archive/2005/05/05/4034.html</p>
<p>http://www.blogdriver.com/goblinize/250559.html</p>
<br>
<img src ="http://www.blogjava.net/junky/aggbug/121754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-04 09:36 <a href="http://www.blogjava.net/junky/archive/2007/06/04/121754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>