SVN权限管理(上)

2021-07-01 14:28:13 浏览数 (1)

一.简介

本章将详细介绍SVN权限配置涉及的两个配置文件, svnserve.conf 和 authz.conf,通过对配置逐行的描述,来阐明其中的一些细节含义。除此之外的其他配置、安装等内容,不是本文重点,读者若有什么疑问,请参考后面“参考文献”中列出的一些文档。

这里首先要注意一点,任何配置文件的有效配置行,都 不允许存在前置空格 ,否则程序可能会出错,给你一个 Option expected 的提示。也就是说,如果你直接从本文的纯文本格式中拷贝了相关的配置行过去,需要手动将前置的4个空格全部删除。当然了,如果你觉得一下子要删除好多行的同样数目的前置空格是一件苦差使,那么也许 UltraEdit 的“Column Mode”编辑模式,可以给你很大帮助。

二.svnserve

SVNconfsvnserve.conf 文件,是 svnserve.exe 这个服务器进程的配置文件,我们逐行解释如下。

代码语言:javascript复制
#首先,我们告诉 svnserve.exe,用户名与密码放在passwd.conf 文件下。当然,你可以改成任意的有效文件名,比如默认的就是 passwd
password-db = passwd.conf
#接下来这两行的意思,是说只允许经过验证的用户,方可访问代码库。那么哪些是“经过验证的”用户呢?噢,当然,就是前面说那些在 passwd.conf 文件里面持有用户名密码的家伙。这两行的等号后面,目前只允许read write none 三种值,你如果想实现一些特殊的值,比如说“read-once”之类的,建议你自己动手改源代码,反正它也是自由软件
anon-access = none
auth-access = write
#接下来就是最关键的一句呢,它告诉 svnserve.exe,项目目录访问权限的相关配置是放在
#当然,svn 1.3.2 引入本功能的时候,系统默认使用 authz 而不是 authz.conf 作为配置文件
authz.conf 文件里
authz-db = authz.conf
#上述的 passwd.conf 和 authz.conf 两个文件也可以作为多个代码库共享使用,我们只要将它们放在公共目录下,比如说放在 ``D:svn`` 目录下,然后在每个代码库的 svnserve.conf 文件中,使用如下语句
password-db = ....passwd.conf
authz-db = ....authz.conf
#或者,这样就可以让多个代码库共享同一个用户密码、目录控制配置文件,这在有些情况下是非常方便的
password-db = ../../passwd.conf
authz-db = ../../authz.conf

三.authz.conf

用户分组

SVNconfauthz.conf文件的配置段,可以分为两类, [group] 是一类,里面放置着所有用户分组信息。其余以 [SVN:/] 开头的是另外一类,每一段就是对应着项目的一个目录,其目录相关权限,就在此段内设置。

首先,我们将人员分组管理,以便以后由于人员变动而需要重新设置权限时候,尽量少改动东西。我们一共设置了5个用户分组,分组名称统一采用 g_ 前缀,以方便识别。当然了,分组成员之间采用逗号隔开

代码语言:javascript复制
[groups]
# 任何想要查看所有文档的非本部门人士
g_vip = morson
# 经理
g_manager = michael
# 北京办人员
g_beijing = scofield
# 上海办人员
g_shanghai = lincon
# 总部一般员工
g_headquarters = rory, linda
# 小秘,撰写文档
g_docs = linda
#注意到没有, linda 这个帐号同时存在“总部”和“文档员”两个分组里面,这可不是我老眼昏花写错了,是因为 Subversion 允许我这样设置。它意味着,这个家伙所拥有的权限,将会比他的同事rory 要多一些,这样的确很方便。具体多了哪些呢?请往下看!

项目根目录

authz.conf接着,我们对项目根目录做了限制,该目录只允许SVN事业部的经理才能修改,其他人都只能眼巴巴的看着

代码语言:javascript复制
[SVN:/]
@g_manager = rw
* = r
  • [SVN:/] 表示这个目录结构的相对根节点,或者说是 SVN 项目的根目录。其中的SVN 字样,其实就是代码库的名称,即前面用 svnadmin create命令创建出来的那个 SVN。
  • 这里的 @ 表示接下来的是一个组名,不是用户名。因为目前 g_manager 组里面只有一个 michael,你当然也可以将 @g_manager = rw 这一行替换成 michael = rw,而表达的意义完全一样。
  • * 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部门经理外的其他所有人”,当然也包括总经理那个怪老头
  • * = r 则表示“那些人只能读,不能写”

项目子目录

然后,我们要给总部人员开放日志目录的读写权限

代码语言:javascript复制
[SVN:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =

这个子目录的设置有些特色,因为从需求分析中我们知道,这个子目录的权限范围要比其父目录小,它不允许除指定了的之外其他任何人访问。在这段设置中,我们需要注意以下几点:

  • 我敢打赌,设计svn的家伙们,大部分都是在类 unix 平台下工作,所以他们总喜欢使用 / 来标识子目录,而完全忽视在 MS Windows 下是用 来做同样的事情。所以这儿,为了表示diaryheadquarters 这个目录,我们必须使用 [SVN:/diary/headquarters]这样的格式。当然如果你一定要用 ,那么唯一的结果就是,Subversion 会将你的这部分设置置之不理,全当没看到。
  • 这里最后一行的 * = 表示,除了经理、总部人员、特别人士之外,任何人都被禁止访问本目录。这一行是否可以省略呢?不行,因为 权限具备继承性 ,子目录会自动拥有父目录的权限。若没有这一行,则所有帐号都可以读取 /diary/headquarters 目录下的文件。因为虽然我们并没有设置这个目录的父目录权限,可是默认的规则使得 /diary 目录的权限与根目录完全一样,从而让其余帐号获得对/diary/headquarters 目录的 r 权限。所以简单来说, * = 这一句的目的,就是割断权限继承性,使得管理员可以定制某个目录及其子目录的权限,从而完全避开其父目录权限设置的影响。
  • 之所以这儿需要将 @g_vip = r 一句加上,就是因为存在上述这个解释。如果说你没有明确地给总经理授予读的权力,则他会和其他人一样,被 * = 给排除在外。
  • 如果众位看官中间,有谁玩过防火墙配置的话,可能会感觉上述的配置很熟悉。不过这里有一点与防火墙配置不一样,那就是各个配置行之间,没有 先后顺序 一说。也就是说,如果我将本段配置的 * = 这一行挪到最前面,完全不影响整个配置的最终效果。

接下来我们看看这一段

代码语言:javascript复制
[SVN:/ref]
@g_manager = rw
@g_docs = rw
* = r

这里的主要看点,就是 g_docs 组里面包含了一个 linda 帐号,她也同时在 g_headquarters 组里面出现,这就意味着, linda 将具备对/refdiaryheadquarters两个目录的读写权限。

svn

0 人点赞