了解VisualSVNServer的授权机制UnderstandingVisualSVNServerauthorizationVisualSVNServer提供一种访问授权机制,可以让你控制用户可以访问的配置库中的特定文件。从用户角度看,VisualSVNServer的访问授权机制与Windows文件系统非常相像。但是有一些明显的差别,没有经验的Subversion新用户饱受困扰。本文讨论VisualSVNServer基本访问控制(AccessControl)原则,也讨论了与Windows访问控制的主要差别。访问规则AccessrulesVisualSVNServer使用基于路径的授权机制(path-basedauthorization)。该机制实际上是VisualSVNServer内部包含的Subversion所提供。采用下述简单格式,就可以配置访问权限:用户名username/组名groupname=访问等级accesslevel.可以在访问规则(accessrules)中,明确配置以下访问等级(accesslevel):不能访问NoAccess只读ReadOnly读写Read/Write如果在父路径中定义一个accessrule,且在当前目录中没有明确重载overloading,那么这个accessrule将显示为“继承的”(inherited)。如左图所示。配置库的每个路径可以配置多个访问规则。对于一个给定的路径,若没有定义任何访问规则accessrule(直接或通过继承),则所有用户都禁止访问。在下列情况下,accessrule适用于某个用户:accessrule针对这个指定的用户;accessrule针对一个用户组,这个组直接或间接包括了这个用户。访问控制的原则确定一个用户的访问等级accesslevel有两条基本原则:继承原则inheritanceprinciple和优先原则priorityprinciple。继承原则Inheritanceprinciple:某个路径的访问权限,被它的所有子目录继承。有以下两条等价的规则:a)给定路径的访问权限覆盖override它的父路径的访问权限Accessrightsforagivenpathoverrideaccessrightsconfiguredforitsparentpaths。b)实际执行时,访问权限被替换为每个基本的用户Accessrightssubstitutionisperformedonaper-userbasis。考虑如何使用继承原则Inheritanceprinciple:在左边这个例子中,用户harry不能访问目录MyProject。按照继承原则Inheritanceprinciple的规则a),从父路径继承下来的访问权限,被当前目录的权限覆盖overridden。在左边这个例子中,用户harry对目录MyProject有只读权限Readonly。Harry是Developers用户组的成员。按照继承原则Inheritanceprinciple的规则a),Harry从MyReopsitory继承下来的访问权限,被当前目录MyProject的权限所覆盖。在左边这个例子中,用户sally拥有目录MyProject的读写read/write权限。sally不是Developers用户组的成员,按照继承原则Inheritanceprinciple的规则b),其从MyReopsitory继承下来的访问权限,不会被当前目录MyProject的权限所覆盖。优先原则Proorityprinciple:若某一路径配置了几条访问规则accessrules均适用于某一用户,则选择权限最宽的那条规则。考虑如何使用优先原则Proorityprinciple:在左边这个例子中,用户harry拥有配置库MyRepository读写权限read/write。harry是用户组Developers的成员,该组的访问权限也适用于他。按照优先原则priorityprinciple,将选择权限最宽的那条规则。与Windows访问控制的差异Subversion基于路径的认证机制与Windows访问控制近似,其主要差别在于Subversion缺乏拒绝规则lackofdeny-rules。拒绝规则Deny-rules优先于允许规则allow-rules,可以用于配置细微的访问权限。考虑一个典型的例子,在Windows访问控制中同时使用允许规则和拒绝规则。假设对某个目录要配置以下访问权限:授权除harry之外的Developers组的所有用户都有完成访问的权限(假定harry是Developers用户组的成员)。在这个示例中,你配置的访问规则应该像下面这样:在左边这个例子中,仅有用户sally获得了目录MyWorkplace的完全控制FullControl权限。针对harry使用了Deny-rule规则。因为Deny-rulse优先于allow-rules,harry对MyWorkspace的访问将被禁止prohibited。在Subversion基于路径的认证机制中Deny-rules是无效的,故在VisualSVNServer中无法使用类似的手段。下面这个示例,描述了一个VisualSVNServer新用户会出现的一个典型错误:在左边这个例子中,用户harry获得了配置库MyRepository的读写read/write权限。在这个例子中,配置管理员天真的假设harry对配置库MyRepository的访问是被明确禁止的。这是完全错误的——“NoAccess”不是一条deny-rlue。按照优先原则priorityprinciple,harry获得了读写read/write权限。如果我们想对某个用户组的部分成员之外的所有成员授权,可以采用以下的技术:在左边这个例子中,仅有用户sally获得了配置库MyRepository的读写read/write权限。因为Deny-rules在Subversion基于路径的认证机制中无效,在此处不得不添加一个额外的用户组TechLeads。(原文最后更新于2009年9月15日)