access 指令提供的访问控制功能非常强大。本节展示一些其用法的示例。首先是一些简单的例子
access to * by * read |
此访问指令授予所有人读取权限。
以下示例显示了如何使用正则表达式通过 DN 选择条目,在两个访问指令中,顺序非常重要。
access to dn=".*, o=U of M, c=US" by * search access to dn=".*, c=US" by * read |
读取权限被授予 c=US 子树下的条目,但 "o=U of M, c=US" 子树下的条目除外,后者被授予搜索权限。由于没有访问指令与此 DN 匹配,因此不授予对 c=US 的访问权限。如果这些访问指令的顺序颠倒,则特定于 U-M 的指令将永远不会匹配,因为所有 U-M 条目也都是 c=US 条目。
实现相同访问控制的另一种方法是
access to dn.children="dc=example,dc=com" by * search access to dn.children="dc=com" by * read |
读取权限被授予 dc=com 子树下的条目,但 dc=example,dc=com 子树下的条目除外,后者被授予搜索权限。由于没有访问指令与此 DN 匹配,因此不授予对 dc=com 的访问权限。如果这些访问指令的顺序颠倒,则尾随指令将永远不会被访问到,因为 dc=example,dc=com 下的所有条目也都在 dc=com 条目下。
注意: 另请注意,如果没有访问指令或没有 "by <who>" 子句匹配,则访问被拒绝。也就是说,每个 access to 指令都以隐式的 by * none 子句结尾,并且每个访问列表都以隐式的 access to * by * none 指令结尾。
下一个示例再次显示了排序的重要性,包括访问指令和 "by <who>" 子句的排序。它还展示了如何使用属性选择器来授予对特定属性的访问权限以及各种 <who> 选择器。
access to dn.subtree="dc=example,dc=com" attr=homePhone by self write by dn.children=dc=example,dc=com" search by peername=IP:10\..+ read access to dn.subtree="dc=example,dc=com" by self write by dn.children="dc=example,dc=com" search by anonymous auth |
此示例适用于 "dc=example,dc=com" 子树中的条目。对于除 homePhone 之外的所有属性,条目可以写入自身,example.com 条目下的条目可以搜索它们,任何其他人都没有访问权限(隐式的 by * none),但身份验证/授权(始终匿名完成)除外。homePhone 属性可由条目写入,可由 example.com 条目下的条目搜索,可由从网络 10 连接的客户端读取,否则不可读(隐式的 by * none)。所有其他访问都由隐式的 access to * by * none 拒绝。
有时,允许特定 DN 从属性中添加或删除自身非常有用。例如,如果您想创建一个组并允许人们仅从 member 属性中添加和删除他们自己的 DN,您可以使用如下访问指令来完成此操作
access to attr=member,entry by dnattr=member selfwrite |
dnattr <who> 选择器表示访问权限适用于 member 属性中列出的条目。selfwrite 访问选择器表示此类成员只能从属性中添加或删除他们自己的 DN,而不能添加或删除其他值。需要添加 entry 属性,因为访问条目是访问条目的任何属性所必需的。
OpenLDAP 管理员指南中有很多关于访问控制的信息。请查看:访问控制 以获取有关此主题的更多信息。