﻿<?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-小秋的家-文章分类-数据库</title><link>http://www.blogjava.net/mycolby/category/39200.html</link><description>home</description><language>zh-cn</language><lastBuildDate>Thu, 29 Jul 2010 20:03:43 GMT</lastBuildDate><pubDate>Thu, 29 Jul 2010 20:03:43 GMT</pubDate><ttl>60</ttl><item><title>LDAP协议基础概念 (转载)</title><link>http://www.blogjava.net/mycolby/articles/326965.html</link><dc:creator>棋剑小秋</dc:creator><author>棋剑小秋</author><pubDate>Fri, 23 Jul 2010 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/mycolby/articles/326965.html</guid><wfw:comment>http://www.blogjava.net/mycolby/comments/326965.html</wfw:comment><comments>http://www.blogjava.net/mycolby/articles/326965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mycolby/comments/commentRss/326965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mycolby/services/trackbacks/326965.html</trackback:ping><description><![CDATA[<span style="font-size: large;"><strong>转载于：http://www.javaeye.com/topic/167125<br />
LDAP协议基础概念</strong></span>
<br />
<br />
1.	从用途上阐述LDAP，它是一个存储静态相关信息的服务，适合&#8220;一次记录多次读取&#8221;。常用LDAP服务存储的信息：
<br />
<ul>
    <li>公司的物理设备信息（如打印机，它的IP地址、存放位置、厂商、购买时间等）
    </li>
    <li>	公开的员工信息（地址、电话、电子邮件&#8230;）
    </li>
    <li>	合同和账号信息（客户信息、产品交付日期、投标信息、项目信息&#8230;）
    </li>
    <li>	凭证信息（认证凭证、许可证凭证&#8230;）
    </li>
</ul>
<br />
2.
从数据结构上阐述LDAP，它是一个树型结构，能有效明确的描述一个组织结构特性的相关信息。在这个树型结构上的每个节点，我们称之为&#8220;条目
（Entry）&#8221;，每个条目有自己的唯一可区别的名称（Distinguished Name
，DN）。条目的DN是由条目所在树型结构中的父节点位置（Base DN）和该条目的某个可用来区别身份的属性（称之为RDN如uid ,
cn）组合而成。对Full DN ：&#8220;shineuserid=linly , ou=Employee , dc=jsoso ,
dc=net&#8221;而言，其中Base DN：&#8220;ou=Employee , dc=jsoso ,
dc=net&#8221;，RDN：&#8220;shineuserid=linly&#8221;下面是一个LDAP服务器的数据结构图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/502f1323-8cd9-3c15-b1cf-5412cf110efa.gif" width="659" height="371" /><br />
3.	从协议衍化上阐述LDAP，它是&#8220;目录访问协议DAP——ISO
X.500&#8221;的衍生，简化了DAP协议，提供了轻量级的基于TCP/IP协议的网络访问，降低了管理维护成本，但保持了强壮且易于扩充的信息框架。
LDAP的应用程序可以很轻松的新增、修改、查询和删除目录内容信息。
<br />
<br />
<span style="font-size: large;"><strong>LDAP目录条目（Directory Entry）简述</strong></span>
<br />
<strong>从Object Classes谈起</strong>
<br />
在LDAP目录数据库中，所有的条目都必须定义objectClass这个属性。这有点像Java语言里说阐述的&#8220;一切皆对象&#8221;的理念，每个条目
（LDAP Entry）都要定义自己的Object Classes。Object Class可以看作是LDAP
Entry的模板，它定义了条目的属性集，包括必有属性（requited attribute）和可选属性（option
attribute）。这里要着重指出的是，在LDAP的Entry中是不能像关系数据库的表那样随意添加属性字段的，一个Entry的属性是由它所继承
的所有Object Classes的属性集合决定的，此外可以包括LDAP中规定的&#8220;操作属性&#8221;（操作属性是一种独立于Object
Class而存在的属性，它可以赋给目录中的任意条目）。如果你想添加的属性不在Object
Classes定义属性的范畴，也不是LDAP规定的操作属性，那么是不能直接绑定（在LDAP中，给Entry赋予属性的过程称为绑定）到条目上的，你
必须自定义一个含有你需要的属性的Object Class，而后将此类型赋给条目。
<br />
Object Class是可以被继承的，这使它看上去真的很像Java语言中的POJO对象。继承类的对象实例也必须实现父
<br />
类规定的必有属性（requited attribute），同时拥有父类规定的可选属性（option
attribute）。继承类可以扩展父类的必有属性和可选属性。由于Object Class的继承特性，因此在一个LDAP
Entry上，objectClass属性是一个多值属性，它涵盖了Object Class的完整继承树，如用户条目uid=Linly ,
ou=People, dc=jsoso ,
dc=net，它直接实现了inetorgperson这个对象类，那么它的objectClass属性值为
inetorgperson，organizationalPerson，person，top。
<br />
<br />
<strong>从Object Classes到Directory Server Schema</strong>
<br />
上一章节中，我们了解了LDAP条目都要遵守的一个最重要的规定Object
Classes，而实际上，对Entry更多更细的规范被涵盖在了Directory Server
Schema（目录服务模式）中。Directory Schema声明了完整的LDAP数据的存储规范，这包括数据的字节大小、数值范围和格式定义。
<br />
默认的，在一个LDAP服务器上，都定义有一套标准的Schema和一套为服务器功能定制的Schema。用户在需要的时候，是可以定制自己的LDAP属
性和Object Class，以扩展标准Schema的功能。在Sun Directory Server中，使用了标准LDAPv3
Schema，并在此基础上做了轻微的扩展。
<br />
<br />
在Schema中的标准属性（Standard Attributes）是一个键-值对,如：cn：linly ，属性ID（属性名）为cn，属性值为linly 。事实上，一个完整的条目就是由一系列的键-值对组成的。以下是一个完整的LDAP Entry：
<br />
<strong>引用</strong><br />
dn: uid=Linly,ou=People, dc=jsoso,dc=net
<br />
telephoneNumber: 13950491407
<br />
mail: linliangyi2005@gmail.com
<br />
objectClass: top
<br />
objectClass: person
<br />
objectClass: organizationalPerson
<br />
objectClass: inetorgperson
<br />
cn: LinLiangyi
<br />
userPassword: {SSHA}aPTgP47LeziVGqjPBI8343FwkcL3QgQQ9kirXw==
<br />
creatorsName: uid=admin,ou=administrators,ou=topologymanagement,o=netscaperoot
<br />
createTimestamp: 20080219070003Z
<br />
nsUniqueId: 2deb0d01-deb811dc-8055dc88-5f880db9
<br />
nsRoleDN: cn=MyAdminRole,ou=People,dc=jsoso,dc=net
<br />
nsRoleDN: cn=secondRole,ou=People,dc=jsoso,dc=net
<br />
cn;phonetic;lang-zh:: IA==
<br />
preferredLanguage: zh-CN
<br />
cn;lang-zh:: 5p6X6Imv55uKICA=
<br />
givenName: liangyi
<br />
givenName;lang-zh:: 6Imv55uK
<br />
sn: lin
<br />
sn;lang-zh:: 5p6X
<br />
uid: linly
<br />
manager: cosTemplateForPostalCode
<br />
modifiersName: uid=admin,ou=administrators,ou=topologymanagement,o=netscaperoot
<br />
modifyTimestamp: 20080227083015Z<br />
在Schema中，对属性的定义包含以下内容：
<br />
<ul>
    <li>	一个唯一的属性名称
    </li>
    <li>	一个属性的OID（object&nbsp; identifier）
    </li>
    <li>	一段属性的文本描述信息
    </li>
    <li>	一个关联属性文法定义的OID
    </li>
    <li>	属性的单值/多值描述；属性是否是目录自有的；属性的由来；附加的一些匹配规则
    </li>
</ul>
<br />
<br />
此外Schema中最重要的部分就是我们上面提到的Object Classes，它实际上是预定义的一套捆绑成套的属性集合。在Schema定义中，Object Classes要包含以下内容：
<br />
<ul>
    <li>	一个唯一的名字
    </li>
    <li>	一个object identifier (OID) 定义Object Class
    </li>
    <li>	一个必有的属性集合
    </li>
    <li>	一个可选的属性集合
    </li>
</ul>
<br />
<br />
<strong>高级LDAP条目</strong>
<br />
在目录服务中，信息是以条目的形式被分层次的组织在一起的。LDAP提供了几种分组机制，使得信息管理更富有弹性。
<br />
<br />
<strong>静态组和动态组（Static Group and Dynamic Group）</strong>
<br />
<strong>组(Group)</strong>，声明一个目录条目的集合
<br />
<strong>静态组（Static Group）：</strong>显式声明了一个它的集合成员，这种方式适用于少量明确的成员组合。
<br />
<strong>动态组（Dynamic Group）</strong>：它定义了一个过滤条件，所有匹配条件的条目都是组的成员。所以称之为动态组，是因为每次读取其组员名单时，要动态计算过滤条件。
<br />
使用组的优点是能够快速的查找所属的成员；缺点是，给出任意的成员，无法获知它所属的组。因此从数据关联关系上看，Group适合一对多的查询。
<br />
<br />
<strong>受管角色、过滤器角色和嵌套角色（Managed Role、Filtered Role and Nested Role）</strong>
<br />
<strong>角色（Role）</strong>，它是条目的另一种集合形式。它与组不同的在于，给定一个任意的成员条目，我们能立刻获知它所属的角色。因此从数据关联关系上看，Role适合多对一的查询。角色定义仅对它们的父节点子树下面的目录条目有效。
<br />
<strong>受管角色（Managed Role）</strong>，它等价于Group中的静态组，不同的是，Role不是把组员信息添加到自身属性中，而是将自身的DN添加到组员条目的nsroledn属性中。
<br />
<strong>过滤器角色（Filtered Role）</strong>，它与动态组相似，通过定义条目过滤器来确定组员。
<br />
<strong>嵌套角色（Nested Role）</strong>，它是对角色定义的一种嵌套形式。可以嵌套其他的嵌套角色的。嵌套角色的成员，是其包含的所有角色成员的合集。嵌套角色通过包含从属于其它子树下的角色，可以扩展其搜索的scope。
<br />
<br />
<strong>服务类CoS</strong>
<br />
服务类实际上是一种属性的共享机制，它无须定义条目间的关联关系，却可以做到数据同步和空间优化。例如，在一个公司目录下，拥有上千个员工，他们拥有相同
的公司地址属性；在传统的条目中，地址属性分别存贮在员工条目里，这样不但浪费存储空间，一旦地址变更，则要对员工条目进行逐一修改。采用CoS机制后，
公司地址属性被存放在一个对象内，员工条目通过引用这个对象来获得地址信息，从而缩小的存储空间损耗，并方便了信息的修改。
<br />
CoS仅对其父节点子树下面的目录条目有效。CoS机制包含两个部分，CoS 定义条目和CoS模板条目。定义条目描述了属性是如何被引用的；模板条目描述了属性的值。CoS机制包含3种类型：
<br />
<strong>指针服务类(Pointer CoS),</strong>
<br />
在Pointer CoS中，CoS包含一个定义Definition Entry，它指定了两个属性：1.共享属性的名称；2.提供共享数据的模板DN。 另外CoS还要有一个Template Entry，它要提供共享的数据。
<br />
在定义了Definition Entry和Template Entry后，Pointer CoS将为其父节点子树下面的所有条目（目标条目Target Entry）分配共享属性和模板所定义的值。示意图如下：
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/b15cd82a-b22b-3c49-b104-4409aee48c01.gif" width="585" height="241" /><br />
Definition Entry：cn=PointerCoS , dc=example , dc=
com定义了CoS的共享属性cosAttribute：postalCode，同时定义了CoS的模板DN
cosTemplateDN：cn=cosTemplateForPostalCode，cn=data。
<br />
	Template Entry: 它是CoS的模板，定义了共享属性值 postalCode：45773。
<br />
	Target Entry：它是目标条目，因为它位于dc=example , dc=com的子树下。所以它获得了共享属性postalCode：45773。
<br />
<br />
<strong>间接服务类(Indirect CoS)</strong>,
<br />
在使用间接服务类时，在Definition Entry条目中定义了CoS的共享属性cosAttribut和一个用来间接指向模板的属性cosIndirectSpecifier。
<br />
首先，我们需要用cosIndirectSpecifier的值A作为属性名，来检索CoS父节点子树中所有拥有A属性的条目，作为目标条目Target Entry。
<br />
其次，根据找到的Target Entry条目中A属性的值来定位模板对象。
<br />
最后，再分别根据找到的模板对象中拥有的共享属性值赋给对应的Target Entry。
<br />
例如，定义如下Definition Entry
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=generateDeptNum,ou=People,dc=example,dc=com
<br />
objectclass: top
<br />
objectclass: LDAPsubentry
<br />
objectclass: cosSuperDefinition
<br />
objectclass: cosIndirectDefinition
<br />
cosIndirectSpecifier: manager
<br />
cosAttribute: departmentNumber</div>
<br />
该CoS定义对条目ou=People,dc=example,dc=com下的子树中所有具有manager属性的 条目有效，同时设定其CoS模板指向manager属性的值所指向的条目。
<br />
又假定有如下的Template Entry条目，它具有属性departmentNumber：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=Carla Fuentes,ou=People,dc=example,dc=com
<br />
&#8230;
<br />
objectclass: cosTemplate
<br />
&#8230;
<br />
departmentNumber: 318842</div>
<br />
同时在ou=People,dc=example,dc=com下有Target Entry如下：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=Babs Jensen,ou=People,dc=example,dc=com
<br />
cn: Babs Jensen
<br />
...
<br />
manager: cn=Carla Fuentes,ou=People,dc=example,dc=com
<br />
departmentNumber: 318842 </div>
<br />
因为该Entry具有manager属性，且在ou=People,dc=example,dc=com子树下，所以它成为了Target
Entity。并且由于其manager的值指向模板cn=Carla
Fuentes,ou=People,dc=example,dc=com，因此，它的departmentNumber为 318842。
<br />
<br />
<strong>经典服务类(Classic CoS)</strong>
<br />
经典服务类同间接服务类有点相似，它也是对属性的间接应用。在Classic
CoS的定义条目中，除了共享属性定义外，还有两个定义，一个是cosTemplateDn，它指向模板条目的父节点；另一个是
cosSpecifier，它的值指向目标条目的属性A。由目标条目的属性A的值来代替模板条目的RND。则目标条目的属性A的值加上
cosTemplateDn的值恰好定义一个唯一的模板条目。
<br />
举例如下，首先是一个经典服务类的定义条目：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=classicCoS,dc=example,dc=com
<br />
objectclass: top
<br />
objectclass: LDAPsubentry
<br />
objectclass: cosSuperDefinition
<br />
objectclass: cosClassicDefinition
<br />
cosTemplateDn: ou=People,dc=example,dc=com
<br />
cosSpecifier: building
<br />
cosAttribute: postalAddress</div>
<br />
该定义条目指明了3个参数，
<br />
1．	要共享的属性是postalAddress
<br />
2．	模板条目的上下文前缀是ou=People,dc=example,dc=com
<br />
3．	模板条目的RDN存储于目标条目的building属性中
<br />
其次，假定有如下模板条目：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=B07,ou=People,dc=example,dc=com
<br />
objectclass: top
<br />
objectclass: LDAPsubentry
<br />
objectclass: extensibleobject
<br />
objectclass: cosTemplate
<br />
postalAddres: 7 Old Oak Street$Anytown, CA 95054</div>
<br />
最后，我们假设有以下目标条目：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">dn: cn=Babs Jensen,ou=People,dc=example,dc=com
<br />
cn: Babs Jensen
<br />
...
<br />
building: B07
<br />
postalAddres: 7 Old Oak Street$Anytown, CA 95054</div>
<br />
由于目标条目中，building属性的值是B07，因此该条目的模板定义DN =
B07加上ou=People,dc=example,dc=com
，即cn=B07,ou=People,dc=example,dc=com，因此目标条目的postalAddres 引用模板的值7 Old Oak
Street$Anytown, CA 95054。
<br />
<br />
<strong>LDAP 目录搜索</strong>
<br />
LDAP搜索是目录服务最常用的功能之一。在LDAP服务中搜索要用到相应的Filter语句。Filter语句由3个部分组成：
<br />
1．	属性，如：cn ，uid ，操作属性如:objectClass&nbsp; ,&nbsp; nsroledn
<br />
2．	比较操作符 ，如 &lt; , &gt; ,= ,&#8230;
<br />
3．	逻辑预算符，如: 与操作&amp;&nbsp; , 或操作| , 非操作！
<br />
关于Filter语句组成的详细参数表如下：
<br />
<strong> filter的运算符</strong>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/d1a62a84-b638-32d7-9d4f-f6829ba54dbf.gif" /><br />
<strong>filter布尔运算符</strong>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/a151eb07-48b5-3d42-a191-67ea6f694aa8.gif" width="572" height="258" /><br />
<strong>搜索过滤器示例 </strong>
<br />
<ul>
    <li>下列过滤器将搜索包含一个或多个 manager 属性值的条目。这也称为存在搜索：manager=*
    </li>
    <li>下列过滤器将搜索包含通用名 Ray Kultgen 的条目。这也称为等价搜索：cn=Ray Kultgen
    </li>
    <li>下列过滤器返回所有不包含通用名 Ray Kultgen 的条目：(!(cn=Ray Kultgen))
    </li>
    <li>下列过滤器返回的所有条目中都有包含子字符串 X.500 的说明属性：description=*X.500*
    </li>
    <li>下列过滤器返回所有组织单元为 Marketing 且说明字段中不包含子字符串 X.500 的条目：(&amp;(ou=Marketing)(!(description=*X.500*)))
    </li>
    <li>下列过滤器返回所有组织单元为 Marketing 且 manager 为 Julie Fulmer 或 Cindy
    Zwaska 的条目：(&amp;(ou=Marketing)(|(manager=cn=Julie
    Fulmer,ou=Marketing,dc=siroe,dc=com)(manager=cn=Cindy
    Zwaska,ou=Marketing,dc=siroe,dc=com)))
    </li>
    <li>下列过滤器返回所有不代表人员的条目：(!(objectClass=person))
    </li>
    <li>下列过滤器返回所有不代表人员且通用名近似于 printer3b 的条目：(&amp;(!(objectClass=person))(cn~=printer3b))
    </li>
</ul>
<br />
<br />
<strong>ldapsearch指令参数</strong>-b 搜索的起始上下文
<br />
<ul>
    <li>-D 绑定搜索的账号Distinguished Name
    </li>
    <li>-h 主机名。地址
    </li>
    <li>-p LDAP服务端口
    </li>
    <li>-l 搜索的最大耗时
    </li>
    <li>-s 从上下文开始的搜索范围，有三个常量base（表示仅当前根对象）/one（当前根对象及下一级）/sub（当前根对象的全部子树）
    </li>
    <li>-W 绑定账号密码
    </li>
    <li>-z 返回结果的最大数量
    </li>
</ul>
<br />
<br />
<strong>搜索&#8220;操作属性&#8221;</strong>
<br />
在LDAP搜索中，操作属性在默认情况下是不会跟随搜索结果返回的。必须在搜索中明确显示的指定操作属性，如：
<br />
<div class="quote_title">引用</div>
<div class="quote_div">ldapsearch -h linly.jsoso.net -p 5201 -D "cn=directory manager" -w password "objectclass=*" aci=accounts。</div>
<br />
<br />
<strong>搜索&#8220;操作对象类&#8221;的条目</strong>
<br />
在LDAP中Role、CoS等对象被定义为特殊的Object Class——操作对象类（operational object
class），在一般的搜索中，这类对象是不会作为结果返回给用户的。要想查找这些对象，必须在filter中显式定义要找这个对象类。例如：
(objectclass=ldapsubentry)。
<br />
<br />
<span style="font-size: large;"><strong>ACI权限控制</strong></span>
<br />
ACI（Access Control Instruction）访问控制指令是LDAP 服务中用以控制用户访问权限的有力手段。在目录的Entry中，aci属性记录了对该条目的多条访问控制指令。（aci属性是一个多值操作属性，可以赋予任意的LDAP条目）
<br />
<strong>ACI的语法格式如下</strong>：aci: (target)(version 3.0;acl "name";permission bind_rules;)
<br />
	<strong>target </strong>指定了ACI要控制访问的目标属性（集合）或条目（集合）。target可以用DN，一个或多个属性，或者一个filter来定义。它是一个可选项。
<br />
<strong>target语法是：</strong>关键字 &lt;op&gt; 表达式 <br />
<strong>target关键字表<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/a390887b-3640-3fffff5efd9a.gif" width="571" height="148" /><br />
</strong>（更多详细的target用法，请参阅 Sun ONE Directory Server 5.2 Administration Guide ）
<br />
<br />
<strong>version 3.0 </strong>这是一个必须的常量字窜，用以识别ACI的版本。
<br />
<br />
<strong>name </strong>指定ACI的名称，可以使任意的字窜，只要区别于同一个条目aci属性下的其他ACI，这是一个必须属性。
<br />
<br />
<strong>permission </strong>指定权限许可。
<br />
<strong>权限包括</strong>：read、write、add、delete、search、compare、selfwrite、 proxy 或 all，其中all表示出了proxy之外的所有操作。
<br />
<strong>权限语法</strong>：allow | deny (权限)
<br />
<br />
<strong>bind_rules </strong>绑定规则。绑定规则定义了何人、何时，以及从何处可以访问目录。绑定规则可以是如下规则之一：
<br />
<ul>
    <li>&#8226; 被授予访问权限的用户、组以及角色
    </li>
    <li>&#8226; 实体必须从中绑定的位置
    </li>
    <li>&#8226; 绑定必须发生的时间或日期
    </li>
    <li>&#8226; 绑定期间必须使用的验证类型
    </li>
</ul>
<br />
<strong>绑定规则语法</strong>：keyword&nbsp; = 或者 != "expression"; （注：timeofday 关键字也支持不等式&lt;、&lt;=、&gt;、&gt;=）。
<br />
<strong>LDIF 绑定规则关键字表</strong>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/mycolby/63b92119-18fdddddddfdd2a3.gif" /><br />
（更多详细的绑定规则用法，请参阅 Sun ONE Directory Server 5.2 Administration Guide ）
<br />
<br />
<strong>ACI样例</strong>
<br />
<ul>
    <li>1.用户 bjensen 具有修改其自己的目录条目中所有属性的权限。
    </li>
    aci:(target="ldap:///uid=bjensen,dc=example,dc=com")(targetattr=*)(version
    3.0; acl "aci1"; allow (write) userdn="ldap:///self";)
    <li>2.允许 Engineering Admins 组的成员修改 Engineering 业务类别中所有条目的 departmentNumber 和 manager 属性
    </li>
    aci:(targetattr="departmentNumber ||
    manager")(targetfilter="(businessCategory=Engineering)") (version 3.0;
    acl "eng-admins-write"; allow (write) groupdn ="ldap:///cn=Engineering
    Admins, dc=example,dc=com";)
    <li>3.允许匿名用户对o=NetscapeRoot下的条目读取和搜索
    </li>
    aci:(targetattr="*")(targetfilter=(o=NetscapeRoot))(version 3.0;
    acl "Default anonymous access"; allow (read, search)
    userdn="ldap:///anyone";)
    <li>4.向所有经过验证的用户授予对整个树的读取访问，可以在dc=example,dc=com 节点创建下列 ACI：
    </li>
    aci:(version 3.0; acl "all-read"; allow (read)userdn="ldap:///all";)
    <li>5.允许对整个 example.com 树进行匿名读取和搜索访问，可以在dc=example,dc=com 节点创建下列 ACI：
    </li>
    aci:(version 3.0; acl "anonymous-read-search";allow (read, search) userdn = "ldap:///anyone";)
    <li>授予Administrators 组对整个目录树写入的权限，则可以在 dc=example,dc=com 节点创建下列 ACI：
    </li>
    aci:(version 3.0; acl "Administrators-write"; allow (write) groupdn="ldap:///cn=Administrators,dc=example,dc=com";)
    <br />
</ul>
<br />
<br />
<img src ="http://www.blogjava.net/mycolby/aggbug/326965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mycolby/" target="_blank">棋剑小秋</a> 2010-07-23 17:21 <a href="http://www.blogjava.net/mycolby/articles/326965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle spatial 查询</title><link>http://www.blogjava.net/mycolby/articles/270811.html</link><dc:creator>棋剑小秋</dc:creator><author>棋剑小秋</author><pubDate>Fri, 15 May 2009 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/mycolby/articles/270811.html</guid><wfw:comment>http://www.blogjava.net/mycolby/comments/270811.html</wfw:comment><comments>http://www.blogjava.net/mycolby/articles/270811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mycolby/comments/commentRss/270811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mycolby/services/trackbacks/270811.html</trackback:ping><description><![CDATA[Oracle Spatial查询数据包括二个处理过程：<br />
1.只通过索引查询候选项。通过函数SDO_FILTER实现：<br />
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)<br />
geometry1：必须是被索引的几何数据<br />
geometry2：不一定是表中的空间字段，也不要求被索引<br />
params：Filter类型<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;querytype=WINDOW：geometry2不要求来自表<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;querytype=JOIN：geometry2必须来自表<br />
<br />
SELECT name boat_name<br />
FROM mylake t<br />
WHERE feature_id = 12<br />
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,<br />
&nbsp; &nbsp; mdsys.sdo_elem_info_array(1,1003,1),<br />
&nbsp; &nbsp; mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),<br />
&nbsp; &nbsp; 'querytype=WINDOW') = 'TRUE';<br />
<br />
2.再检查每个候选项是否和条件精确匹配。通过函数SDO_RELATE实现：<br />
SDO_RELATE(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)<br />
params：masktype类型<br />
<br />
DISJOINT — the boundaries and interiors do not intersect <br />
TOUCH — the boundaries intersect but the interiors do not intersect <br />
OVERLAPBDYDISJOINT — the interior of one object intersects the boundary and interior of the other object, but the two boundaries do not intersect. This relationship occurs, for example, when a line originates outside a polygon and ends inside that polygon. <br />
OVERLAPBDYINTERSECT — the boundaries and interiors of the two objects intersect <br />
EQUAL — the two objects have the same boundary and interior <br />
CONTAINS — the interior and boundary of one object is completely contained in the interior of the other object <br />
COVERS — the interior of one object is completely contained in the interior of the other object and their boundaries intersect <br />
INSIDE — the opposite of CONTAINS. A INSIDE B implies B CONTAINS A. <br />
COVEREDBY — the opposite of COVERS. A COVEREDBY B implies B COVERS A. <br />
ON — the interior and boundary of one object is on the boundary of the other object (and the second object covers the first object). This relationship occurs, for example, when a line is on the boundary of a polygon. <br />
ANYINTERACT — the objects are non-disjoint. <br />
// 选择在定义矩形内的所有小船<br />
SELECT name boat_name<br />
FROM mylake t<br />
WHERE feature_id = 12<br />
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,<br />
&nbsp; &nbsp; mdsys.sdo_elem_info_array(1,1003,1),<br />
&nbsp; &nbsp; mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),<br />
&nbsp; &nbsp; 'querytype=WINDOW') = 'TRUE'<br />
AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,<br />
&nbsp; &nbsp; mdsys.sdo_elem_info_array(1,1003,1),<br />
&nbsp; &nbsp; mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),<br />
&nbsp; &nbsp; 'masktype=INSIDE querytype=WINDOW') = 'TRUE'<br />
<br />
// masktype可联合使用<br />
SELECT feature_id id<br />
FROM mylake t<br />
WHERE feature_id = 12<br />
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,<br />
&nbsp; &nbsp; mdsys.sdo_elem_info_array(1,1003,1),<br />
&nbsp; &nbsp; mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),<br />
&nbsp; &nbsp; 'querytype=WINDOW') = 'TRUE'<br />
AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,<br />
&nbsp; &nbsp; mdsys.sdo_elem_info_array(1,1003,1),<br />
&nbsp; &nbsp; mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),<br />
&nbsp; &nbsp; 'masktype=INSIDE+TOUCH querytype=WINDOW') = 'TRUE'<br />
<br />
Oracle Spatial 提供的其他查询函数：<br />
Query Description <br />
SDO_NN Nearest neighbor <br />
SDO_SDO_WITHIN_DISTANCE All geometries with a certain distance <br />
<br />
Functions Description <br />
SDO_GEOM.SDO_MBR The minimum bounding rectangle for a geometry <br />
SDO_GEOM.SDO_DISTANCE The distance between two geometries <br />
SDO_GEOM.SDO_INTERSECTION Provides the intersection point of two geometries<br />
<img src ="http://www.blogjava.net/mycolby/aggbug/270811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mycolby/" target="_blank">棋剑小秋</a> 2009-05-15 11:39 <a href="http://www.blogjava.net/mycolby/articles/270811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 监听程序无法识别连接描述中请求的服务解决方法!</title><link>http://www.blogjava.net/mycolby/articles/270181.html</link><dc:creator>棋剑小秋</dc:creator><author>棋剑小秋</author><pubDate>Tue, 12 May 2009 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/mycolby/articles/270181.html</guid><wfw:comment>http://www.blogjava.net/mycolby/comments/270181.html</wfw:comment><comments>http://www.blogjava.net/mycolby/articles/270181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mycolby/comments/commentRss/270181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mycolby/services/trackbacks/270181.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天打开eclipse,一连接数据库结果就报错,错误如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Could not obtain connection metadata<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.sql.SQLException: Listener refused the connection with the following error:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORA-12505, TNS:listener does not currently know of SID given in connect descriptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The Connection descriptor used by the client was:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localhost:1521:orcl&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;奇怪了,我就换了一个jdk版本啊....到处找毛病,怎么都没解决掉...结果当我打开plsql,结果才发现plsql也连接不上,提示oracle 监听程序无法识别连接描述中请求的服务..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于是在google的到处寻找问题所在,终于让我给解决了,解决方法如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开network/admin/listener.ora文件,把下面这段话加进去:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SID_DESC =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (GLOBAL_DBNAME = ORCL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_NAME = ORCL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加进去后完整的如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SID_LIST_LISTENER =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_DESC =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_NAME = PLSExtProc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGRAM = extproc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SID_DESC =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(GLOBAL_DBNAME = ORCL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_NAME = ORCL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保存,再重新启动监听器,OK,一切OK....但是到现在我也不知道用的好好的oracle突然间出问题了...<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/mycolby/aggbug/270181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mycolby/" target="_blank">棋剑小秋</a> 2009-05-12 13:41 <a href="http://www.blogjava.net/mycolby/articles/270181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 数据库创建表空间、创建用户指定表空间</title><link>http://www.blogjava.net/mycolby/articles/267102.html</link><dc:creator>棋剑小秋</dc:creator><author>棋剑小秋</author><pubDate>Thu, 23 Apr 2009 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/mycolby/articles/267102.html</guid><wfw:comment>http://www.blogjava.net/mycolby/comments/267102.html</wfw:comment><comments>http://www.blogjava.net/mycolby/articles/267102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mycolby/comments/commentRss/267102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mycolby/services/trackbacks/267102.html</trackback:ping><description><![CDATA[<ol class="dp-default">
    <li><span><span>//创建临时表空间 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>create&nbsp;temporary&nbsp;tablespace&nbsp;user_temp &nbsp;&nbsp;</span></li>
    <li><span>tempfile&nbsp;</span><span class="string">'D:\oracle\oradata\Oracle9i\user_temp.dbf'</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>size&nbsp;50m &nbsp;&nbsp;</span></li>
    <li><span>autoextend&nbsp;on &nbsp;&nbsp;</span></li>
    <li><span>next&nbsp;50m&nbsp;maxsize&nbsp;20480m &nbsp;&nbsp;</span></li>
    <li><span>extent&nbsp;management&nbsp;local; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>//创建数据表空间 &nbsp;&nbsp;</span></li>
    <li><span>create&nbsp;tablespace&nbsp;test_data &nbsp;&nbsp;</span></li>
    <li><span>logging &nbsp;&nbsp;</span></li>
    <li><span>datafile&nbsp;</span><span class="string">'D:\oracle\oradata\Oracle9i\user_data.dbf'</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>size&nbsp;50m &nbsp;&nbsp;</span></li>
    <li><span>autoextend&nbsp;on &nbsp;&nbsp;</span></li>
    <li><span>next&nbsp;50m&nbsp;maxsize&nbsp;20480m &nbsp;&nbsp;</span></li>
    <li><span>extent&nbsp;management&nbsp;local; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>//创建用户并指定表空间 &nbsp;&nbsp;</span></li>
    <li><span>create&nbsp;user&nbsp;username&nbsp;identified&nbsp;by&nbsp;password &nbsp;&nbsp;</span></li>
    <li><span>default&nbsp;tablespace&nbsp;user_data &nbsp;&nbsp;</span></li>
    <li><span>temporary&nbsp;tablespace&nbsp;user_temp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>//给用户授予权限 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>grant&nbsp;connect,resource&nbsp;to&nbsp;username; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>//以后以该用户登录，创建的任何数据库对象都属于user_temp&nbsp;和user_data表空间，这就不用在每创建一个对象给其指定表空间了&nbsp;&nbsp;</span></li>
    <li><span>该文章转载于：http://lpcjrflsa.javaeye.com/blog/309811</span></li>
</ol>
<img src ="http://www.blogjava.net/mycolby/aggbug/267102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mycolby/" target="_blank">棋剑小秋</a> 2009-04-23 11:16 <a href="http://www.blogjava.net/mycolby/articles/267102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>