平台/版本:
Windows Server 2008 R2 Std SP1(64 位)
CollabNet Subversion Apache 2.2.23(win32)
CollabNet Subversion Client Svnserve V1.7.8
使用 SSPI(活动目录)进行身份验证
用户在 Windows 7 Pro 上运行 Tortoise SVN Client V1.8.11(64 位)或更高版本
我们使用访问控制文件来限制谁有权访问 Subversion 顶级存储库。我们现在想要限制对顶级下某些文件夹的访问。我们参考了以下示例,但它们似乎对我们不起作用:
https://nithint.wordpress.com/2009/12/17/format-of-svn-access-file-for-path-based-authorization/
https://www.open.collab.net/community/subversion/svnbook/svn.serverconfig.pathbasedauthz.html
我们发现,如果您拥有顶层的访问权限,那么您就可以访问所有下层文件夹,包括那些应该被拒绝访问的文件夹。此外,如果您没有顶层的访问权限,但被授予了下层访问权限,您仍然无法访问下层。(我们对后者表示满意,但觉得很奇怪,因为它似乎与网站关于权限的说法相矛盾,即下层的权限应该覆盖上层的权限。)下层的访问控制似乎被忽略了。
我们想要的是:
Junk_repo – 顶级,授予 Beth、Eric 和 Joe 访问权限
Junk_repo/Commercial – 授予 Beth、Eric 和 Joe 访问权限
Junk_repo/Military – 授予 Beth 和 Eric 访问权限。拒绝 Joe 访问
我们尝试使用组并按组设置权限。(我们使用域\用户 ID 活动目录身份验证,因此我们的访问控制文件也使用域\用户 ID 格式。)
团体:
Junk_repo_team = domain\beth, domain\eric, domain\joe
Junk_repo_comm_team = domain\beth, domain\eric, domain\joe
Junk_repo_mil_team = domain\beth, domain\eric (没有 Joe)
访问方式:
[Junk_repo:/]
@Junk_repo_team = rw //Beth, Eric Joe have access
[Junk_repo:/Commercial]
@Junk_repo_comm_team = rw // commercial team (Beth, Eric, Joe) has access
[Junk_repo:/Military]
@Junk_repo_mil_team = rw // military team (Beth, Eric) has access. No access for Joe
上述操作失败了,因此我们尝试通过列出每个级别的用户 ID 来设置权限:
[Junk_repo:/]
domain\beth = rw //Beth, Eric and Joe have access
domain\eric = rw
domain\joe = rw
[Junk_repo:/Commercial]
domain\beth = rw //Beth, Eric and Joe have access
domain\eric = rw
domain\joe = rw
[Junk_repo:/Military]
//Beth and Eric have access. Joe does not have access.
domain\beth = rw
domain\eric = rw
domain\joe=
//We even tried specifically denying Joe access to the Military folder by listing his id without anything after the equal sign.
在这两种情况下,Joe 都能够访问 Junk_repo/Military 文件夹,而我们明确地不希望他访问该文件夹。
您是否有过在存储库的各个层级阻止访问的经验?如果有,您是否发现我们做错了什么?
SVN 位置
<Location /Junk_repo>
DAV svn
SVNPath E:/svn_repository/Junk_repo
AuthType Basic
AuthName "Subversion Junk_repo repository"
Require valid-user
ErrorDocument 404 default
</Location>
答案1
你忘记了一些显而易见的事情(在第一次尝试中,必须失败)
- ACL 是从父母那里继承到孩子的
- 如果你想改变规则,你必须写一个规则,修改访问权限
- 如果你使用 authz-file 与 Apache 提供的存储库,你必须拥有
- SVN-Location 中的相关指令
- LoadModule 用于基于路径的授权
(最后一点可能是主要原因——您没有基于路径的授权,而且我无法检查 CollabNet 的默认设置)
因此,对于以群体为中心的游戏,你有:
- @Junk_repo_team 有权访问 Junk_repo 的根目录
- @Junk_repo_team和@Junk_repo_comm_team 有权访问
/Commercial
节点(直接规则和继承) - @Junk_repo_team和@Junk_repo_mil_team 有权访问
/Military
节点(直接规则和继承)-因此,Joe作为@Junk_repo_team 的成员有权访问节点
第二条具有个人访问权限的规则集是差不多了乍一看,只有一些缩短(由于规则继承)可以立即应用,例如:
[Junk_repo:/]
domain\beth = rw
domain\eric = rw
domain\joe = rw
[Junk_repo:/Military]
domain\joe=
(可以跳过从根规则继承的规则,只需使用重新定义规则)并且在这个表单中我希望看到 Joe 的“无权访问”。
但是,因为你使用了相当老版本的 SVN Book(它没有注意别名),我不记得了,domain\joe
auth-file 中的用户名是否适用和无法测试您的设置(您没有显示任何用户的任何修订的日志输出,但基于 LDAP 的名称可以有不同的形式)我会建议稍微完善的设置(最小的差异:两者都有别名,一个是基于组的,接下来有仅限组的规则),基于原始SVN 1.8 版 SVN 手册
某些身份验证系统需要并携带相对较短的用户名,如我们在此描述的那种 - harry、sally、joe 等等。但其他身份验证系统(例如使用 LDAP 存储或 SSL 客户端证书的系统)可能携带更复杂的用户名。例如,在受 LDAP 保护的系统中,Harry 的用户名可能是 CN=Harold Hacker,OU=Engineers,DC=red-bean,DC=com。使用这样的用户名,访问文件可能会变得非常臃肿,因为用户名太长或晦涩难懂,容易输入错误。幸运的是,Subversion 1.5 在访问文件语法中引入了用户名别名。用户名别名允许您只需在语句中输入一次正确的复杂用户名,该语句会为其分配一个更容易理解的别名。
基于 AD 的用户名正是这种情况,因此我们将在定义规则和组之前为所有用户设置别名(针对第 1 次配置)
基于组的配置
[aliases]
beth = full and tested username of beth
eric = full and tested username of eric
joe = full and tested username of joe
[groups]
Junk_repo_team = &beth, &eric, &joe
Junk_repo_comm_team = &beth, &eric, &joe
Junk_repo_mil_team = &beth, &eric
[Junk_repo:/]
@Junk_repo_team = rw
[Junk_repo:/Commercial]
@Junk_repo_team = // no inheritance mess!!! only direct-rules
@Junk_repo_comm_team = rw
[Junk_repo:/Military]
@Junk_repo_team = // no inheritance mess!!! only direct-rules
@Junk_repo_mil_team = rw
(我可以忽略抑制商业的继承规则,但不能忽略抑制军事的继承规则,并且不能为两个节点选择相同性)
基于用户的配置
[aliases]
beth = full and tested username of beth
eric = full and tested username of eric
joe = full and tested username of joe
[Junk_repo:/]
&beth = rw
&eric = rw
&joe = rw
[Junk_repo:/Military]
&joe =
PS:Collabnet 的 SVN 堆栈很好在 CollabNet Edge 时代,当今首选的解决方案(从我的角度来看)是可视化 SVN 服务器具有所有最新功能、GUI 管理控制台(用于所有任务)、远程管理......
答案2
我们发现子文件夹 repo 权限必须输入为
[Junk_repo:/trunk/Military],
而不是 [Junk_repo:/Military]。(设置中缺少 Trunk。)Military 不是路径中的实际文件夹,而是 Junk_repo 主干颠覆区域外的一个文件夹。