svn服务端实现目录对特定群组“完全隐藏”需在authz文件中为该路径配置空权限(如@group =),并确保svnserve.conf启用权限校验(anon-access = none、authz-db = authz等),重启服务后 tester 组访问该路径将直接报错而非返回空列表。

SVN服务端实现目录对特定群组“完全隐藏”,本质是让该群组对该路径没有任何访问权限——既不能读、也不能列目录、更不能写。这不同于只读(r)或可写(rw),而是彻底不暴露该路径的存在。关键在于正确配置 authz 文件,并配合服务端启用权限控制。
确认 svnserve 已启用权限校验
若未开启认证授权,所有权限设置都无效。检查仓库 conf/svnserve.conf 中的 [general] 区块,确保以下几行已取消注释且配置合理:
- anon-access = none:禁止匿名访问,避免未登录用户绕过权限
- auth-access = write:允许认证用户进行写操作(读权限由 authz 控制)
- password-db = passwd:指向密码文件路径
- authz-db = authz:明确指定权限控制文件为 authz
在 authz 中定义用户组与路径权限
权限生效依赖两个前提:用户组定义清晰,路径权限精确到“空”。以一个常见场景为例——仓库名为 myrepo,需让 testers 组完全看不到 /backend 目录:
- 先在 [groups] 段定义群组:
[groups]
testers = alice, bob
devs = charlie, diana - 再为根目录设基础权限(保障其他路径可访问):
[myrepo:/]
@devs = rw
* = r(* 表示未显式列出的用户/组,默认只读) - 对目标目录设置“完全隐藏”:
[myrepo:/backend]
@testers =(等号后**不填任何字符**,即空值)
注意:空权限 ≠ 无配置。只要该路径下明确写了 @testers =(后面没内容),SVN 就会拒绝 testers 访问该路径下的任何操作,包括 svn list 或 svn checkout,客户端会提示“Access denied”或“Path not found”,效果即为“隐藏”。
避免继承干扰,慎用通配符和默认权限
SVN 权限具有继承性:子目录默认继承父目录权限,除非被显式覆盖。因此:
- 如果 /backend/conf 下还需单独控制,必须显式写出:
[myrepo:/backend/conf]
@testers = - 不要在根目录写
* =(空),否则所有未列名的用户都会被全局屏蔽,连登录都失败 - 确保目标路径(如 /backend)本身已被管理员创建并提交过,否则权限规则不生效
重启服务并验证行为
修改 authz 和 svnserve.conf 后,必须重启 SVN 服务(如 killall svnserve && svnserve -d -r /path/to/repos)。验证时使用 tester 账号尝试:
-
svn list svn://host/myrepo/backend→ 应报错,而非返回空列表 -
svn checkout svn://host/myrepo/backend→ 失败,提示拒绝访问 - 但
svn list svn://host/myrepo/trunk仍应正常返回(前提是 trunk 对 tester 有 r 权限)











