如何在SVN中设置访问控制?

87
我已经使用SVN设置了一个代码库并上传了项目,有多个用户在这些项目上工作。但不是每个人都需要访问所有的项目。我想为每个项目设置用户权限。
我该如何做到这一点?
7个回答

89

在您的svn \ repos \ YourRepo \ conf文件夹中,您将找到两个文件,authzpasswd。这就是你需要调整的两个文件。

passwd文件中,您需要添加一些用户名和密码。假设您已经完成了此操作,因为您有人在使用它:

[users]
User1=password1
User2=password2

然后您需要根据 authz 文件相应地分配权限:

创建所需的概念组,并将人员添加到其中:

[groups]
allaccess = user1
someaccess = user2

然后从权限和项目级别选择他们拥有的访问权限。

因此,让我们将我们的“完全访问”人员从根目录赋予所有访问权限:

[/]
@allaccess = rw

但是只给我们的“一些访问权限”的人对一些较低级别项目的只读访问权限:

[/someproject]
@someaccess = r

您还可以在 authzpasswd 文件中找到一些简单的文档。


8
相关的手册页面是:http://svnbook.red-bean.com/en/1.7/svn.serverconfig.pathbasedauthz.html。 - ErichBSchulz
1
注意:如果您通过SSH(没有svnserve)直接访问存储库,则无法工作。 - ALex_hha
当我将存储库中的一个文件夹分配给用户时,用户只能通过直接链接访问此文件夹。用户是否可以添加存储库,并且仅向其分配的文件夹对他进行显示?感谢您的回复。 - maoanz
组使用@groupname进行调用。在定义规则时,这个问题曾经困扰过我,但在你的示例中表现得很完美,我只是指出一下。 - Wolfeh

28

@Stephen Bailey

为了完成您的回答,您还可以通过存储库中的纯文本文件将用户权限委派给项目经理。

要做到这一点,您需要使用默认authz文件设置SVN数据库,其中包含以下内容:

###########################################################################
# The content of this file always precedes the content of the
# $REPOS/admin/acl_descriptions.txt file.
# It describes the immutable permissions on main folders.
###########################################################################
[groups]
svnadmins = xxx,yyy,....

[/]
@svnadmins = rw
* = r
[/admin]
@svnadmins = rw
@projadmins = r
* =

[/admin/acl_descriptions.txt]
@projadmins = rw

这个默认的authz文件授权SVN管理员可以修改您的SVN仓库中一个可见的明文文件'/admin/acl_descriptions.txt',在这个文件中,SVN管理员或项目经理将修改并注册用户。

然后,您可以设置一个pre-commit hook,它将检测修订版是否由那个文件组成(只有那个文件)。

如果是,该钩子脚本将验证您明文文件的内容,并检查每行是否符合SVN语法。

然后,一个post-commit hook会使用以下内容的连接更新\conf\authz文件:

  • 上面介绍的TEMPLATE authz文件
  • 明文文件/admin/acl_descriptions.txt

第一次迭代由SVN管理员完成,他们添加了:

[groups]
projadmins = zzzz

他提交了修改,这将更新 authz 文件。

然后项目经理 'zzzz' 可以添加、删除或声明任何他想要的用户组和用户。他提交文件后,authz 文件将被更新。

这样,SVN 管理员就不必为所有 SVN 存储库单独管理所有用户。


27

一个常见的问题曾经让我困扰:

[repos:/path/to/dir/] # this won't work

但是
[repos:/path/to/dir]  # this is right

您不应该在目录末尾添加斜杠,否则OPTIONS请求会返回403错误。

8
你可以使用svn+ssh:,然后基于指定位置的存储库进行访问控制。
这就是我在大学托管项目组存储库的方式,在那里我无法设置其他任何东西。只需要拥有一个小组拥有的目录,并在其中运行svn-admin(或其他类似命令),这意味着我不需要进行任何配置。

这是一个令人震惊的答案。这个ssh方法文档不完善,似乎只适用于Linux。 - user1040323
1
这完全不是事实。只需要在Windows服务器上运行SSH守护程序,svn+ssh就可以像在Linux上一样正常工作。有许多教程可以解释如何在Windows机器上运行SSH。 - Chuck Wolber
亲爱的@user1040323,除了Windows之外还有其他非Linux平台:我很确定我使用的机器不是Linux,而是某种BSD变体。 - Matthew Schinckel

5
尽管我建议使用Apache方法更好,但SVN Serve也可以正常工作并且非常简单。假设你的代码库名为"my_repo",并且它存储在C:\svn_repos中:
  1. Create a file called "passwd" in "C:\svn_repos\my_repo\conf". This file should look like:

    [Users]
    username = password
    john = johns_password
    steve = steves_password
    
  2. In C:\svn_repos\my_repo\conf\svnserve.conf set:

    [general]
    password-db = passwd
    auth-access=read
    auth-access=write
    

这将强制用户登录才能读取或写入此存储库。

对于每个存储库,请按照以下步骤操作,仅在每个存储库的passwd文件中包含适当的用户。


注意:密码以明文形式存储在 SVN 配置文件中! - AVA

3
最好的方法是设置Apache并通过它进行访问。查看svn book获取帮助。如果您不想使用Apache,也可以使用svnserve进行最小化的访问控制。

0

Apache子版本控制支持基于路径的授权,帮助您配置用户和组帐户在存储库(文件或目录)中路径上的细粒度权限。 基于路径的授权支持三个访问级别-无访问、只读和读/写。

基于路径的授权权限存储在每个存储库或每个服务器授权文件中,具有特殊语法。 以下是SVNBook的一个示例:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

当您需要一个包含多个路径和帐户的复杂权限结构时,您可以从VisualSVN Server提供的基于GUI的权限管理工具中受益:

  • 服务器管理员可以通过VisualSVN Server管理器控制台或PowerShell管理用户和组权限,
  • 非管理员用户可以通过RepoCfg管理权限。

VisualSVN Server Manager中的存储库权限 enter image description here

PowerShell中的存储库权限 enter image description here

非管理员用户可以通过RepoCfg工具管理权限 enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接