作者:朱金灿

 

       SVN是常用的源码管理工具。今天在服务器端使用SVN创建版本库和用户出现了一些问题,特总结一些经验教训。


在服务器端创建版本库的命令很简单,如下:

在命令行模式下,运行命名:svnadmin create d:/svnRoot/TCM,即可在d盘下创建一个版本库vwas。


创建了版本库后第一步是如何禁止匿名用户访问,网上是众说纷纭。经过我的实践,发现下面的做法是可行的。接上一步创建了一个版本库TCM后,会有一个TCM的文件夹,在该文件夹下有一个conf的子文件夹。该文件夹下有三个配置文件Svnserve、authz和passwd文件。

Svnserve 是一个总控文件,负责制定匿名用户是否可以访问、授权文件是哪个、密码文件是哪个,用户名比较是否区分大小写。其中有以下选项(#为注释标记):

# anon-access = none  这一句是指定匿名用户是否可以访问,网上的一种说法是把这句注释去掉匿名用户就不能访问了(这里注释去掉必须把anon-access前面的空格也去掉,否则有svnserve.conf option expected的错误出现)。实际上有一个副作用是出现有权限的没有权限的都不能访问了。报“No access allowed to this repository”。


   要解决禁止匿名用户访问,还得看另一个文件authz。authz顾名思义,是一个权限配置文件。后来我发现要熟悉使用SVN,就得了解authz的语法。网上是这样解释authz文件的语法的:

该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。


   [groups]配置段中配置行格式如下:

       <用户组> = <用户列表>

    用户列表由若干个用户组或用户名构成,用户组或用户名之间用逗号","分隔,引用用户组时要使用前缀"@"(如:引用用户组"all"要使用字符串"@all")。


    版本库路径权限段的段名格式如下:

       [<版本库名>:<路径>]

    如版本库abc路径/tmp的版本库路径权限段的段名为"[abc:/tmp]"。

    可省略段名中的版本库名。若省略版本库名,则该版本库路径权限段对所有版本库中相同路径的访问控制都有效。如:段名为"[/tmp]"的版本库路径权限段设置了所有引用该权限配置文件的版本库中目录"/tmp"的访问权限。


    版本库路径权限段中配置行格式有如下三种:

       <用户名> = <权限>

       <用户组> = <权限>

       * = <权限>

    其中,"*"表示任何用户;权限的取值范围为''、'r'和'rw',''表示对该版本库路径无任何权限,'r'表示具有只读权限,'rw'表示有读写权限。

    注意:每行配置只能配置单个用户或用户组。


    例3:权限配置文件conf/authz的内容如下:

       [groups]

       g_admin = admin,thinker


       [admintools:/]

       @g_admin = rw

       * =


       [test:/home/thinker]

       thinker = rw

       * = r


       在上述配置文件中,定义了一个用户组"g_admin",该用户组包含用户"admin"和"thinker"。然后定义了2个版本库路径权限段。其中,版本库"admintools"只有用户组"g_admin"可读写,其他用户无任何权限;版本库"test"中路径"/home/thinker"只有用户"thinker"有读写权限,其他用户只有可读权限。


     因此你要禁止匿名用户访问,就得在版本库配置行这样写(红色部分):

[TCM:/]

# @harry_and_sally = rw

* =


   现在开始新建用户。比如开发组名为dev_group,组员是张三和李四,那就可以在authz文件添加信息(红色部分):


    [groups]

# harry_and_sally = harry,sally

# harry_sally_and_joe =harry,sally,&joe

dev_group = zhangsan,lisi


# []

# harry = rw

# &joe = r

# * =


[TCM:/]

# @harry_and_sally = rw

* =

@ dev_group = rw

Passwd文件就是一个存贮用户密码的文件,对应上文的张三和李四就可以在这个文件添加如下信息(123456为密码):


[users]

# harry = harryssecret

# sally = sallyssecret

zhangsan = 123456

lisi = 123456