今天接着昨天的内容讲Subversion的安全配置。在上一讲中我们在Apache的httpd.conf文档里加入了这样一节:
DAV svn
SVNParentPath e:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
下面我来解释一下这些配置信息用途:
说明我们任何的代码仓库在/svn这个虚拟目录下
DAV svn
说明Apache会使用svn这个module来解析这个虚拟目录
SVNParentPath e:\SVN
说明任何的代码仓库都在本地硬盘的e:\SVN下
AuthType Basic
使用最基本的认证校验,用户名/密码
AuthName "Subversion repositories"
说明在认证对话框弹出的时候,对话框的标题显示,您能够把他修改成您想要的任何提示信息,比如:AuthName "Warning"等等
AuthUserFile passwd
说明我们使用的access list文档的名字,在上一讲中我们建立的文档名字是passwd,所以这里是passwd。假如您建立的文档名字是其他的,这里要作相应的改变
AuthzSVNAccessFile
说明svn自己控制的access list文档,这个文档很重要,能够丰富svn的安全配置,在下面会讲到
Require valid-user
说明只有输入正确的用户名/密码才能访问
上述的配置只能是最简单的安全配置,假如您想拥有更强大的安全配置,就需要加入一些东西了。比如:
假如您想让任何的匿名用户能访问代码仓库,对某些特定用户才开放可写的权限,则需要把
Require valid-user
改成
Require valid-user
假如您对于代码仓库里面某些目录更有更细致的访问控制,只用passwd就没办法啦,这个时候我们就需要AuthzSVNAccessFile文档了,去掉#AuthzSVNAccessFile svnaccessfile这一行前面的注释。Apache首先会使用passwd校验用户名和密码,然后会认证信息传给Subversion的AuthzSVNAccessFile模块,由这个模块作更进一步的权限控制。首先我们来新建一个文档svnaccessfile,内容如下:
[groups]
developers = user1,user2,user3,user4
docs = user5,user6,user7
#to allow everyone read access
[/]
* = r
#allow all developers complete access
@developers = rw
#give the doc people write access to the docs folder
[/project/trunk/doc]
@docs = rw
首先我们定义了两个group,一个是developer,代表研发组,另外一个是docs,代表文档撰写组,然后
[/]
* = r
意思是对于任何的用户开放可读的权限。注意这里的[/],表示是对根目录下的任何代码仓库赋予权限。接着是
@developers = rw
[/project/trunk/doc]
@docs=rw 这这里的@应该代表的是group的意思(这个还没有确认,是我自己猜测的,因为假如是直接给单一用户赋予权限,则无需前面的@,哪位大侠能够证实一下我的猜测?欢迎指教)注意这里对于docs这个组,我们相同指定了目录路径,而不是对于整个代码仓库。
这里再说说SVNParentPath,配置了SVNParentPath,以后每次在根目录下面加入新的repository就无需再重新配置Subversion和Apache了,自动获取了根目录的配置信息,很方便。然而这也引发了另外一个问题,当您在浏览器地址栏里输入
http://youserver/svn/
的时候,服务器会报错,提示您没有权限访问访问这个url,我们想要的效果是浏览到这个url时能够把根目录下的任何的repository列出来。完成这个工作需要写点代码了,使用的工具能够是很多,这里使用php,当然我想用perl或python一定是没有问题。首先要安装php,使apache支持php. 以下是参考了shg918的文档,在此表示感谢!
首先去
http://www3.skycn.com/soft/9122.html
下载php4.3.1,接下来我们来手动配置一下apache。
将下载的php压缩文档解压,文档夹改名为php复制到您想放置的目录路径下,注意目录名不能有空格,否则apache会很难找到相关的module,比如D:/php-4.3.10RC1-Win32。
打开刚才解压的PHP目录,您会发现有一个叫做"php.ini-dist"的文档,这就是PHP的配置文档了,您需要把他改名成"php.ini",然后复制到系统目录windows(2K应该是winnt)下。打开这个配置文档,把; cgi.force_redirect = 1改成 cgi.force_redirect = 0,这样做是强迫不运行在cgi模式下,我们希望php工作在Apache的module模式下。
PHP安装目录下的"php4ts.dll"必须要复制到windows系统的system32目录下。
dlls和extensions目录里的任何文档拷到system32里。(我猜测这里是为了支持mysql等才需要作的,可能对我们来说并无需。)
打开Apache的配置文档http.conf,在module配置节末尾加上LoadModule php4_module D:/php-4.3.10RC1-Win32/sapi/php4apache2.dll和AddType application/x-httpd-php .php .php3 .php4
Ok,配置完毕,现在Apache能够支持php了。现在用文本编辑器编写一个php文档,保存为svn_index.php,内容如下:

html>


head>


title>Subversion Repositoriestitle>


head>


body>




h2>Subversion Repositoriesh2>


p>


php


$svnparentpath = "e:/svn";


$svnparenturl = "/svn";




$dh = opendir( $svnparentpath );


if( $dh ) {


while( $dir = readdir( $dh ) ) {


$svndir = $svnparentpath . "/" . $dir;


$svndbdir = $svndir . "/db";


$svnfstypefile = $svndbdir . "/fs-type";


if( is_dir( $svndir ) && is_dir( $svndbdir ) ) {


echo "" . $dir . "\n";


if( file_exists( $svnfstypefile ) ) {


$handle = fopen ("$svnfstypefile", "r");


$buffer = fgets($handle, 4096);


fclose( $handle );


$buffer = chop( $buffer );


if( strcmp( $buffer, "fsfs" )==0 ) {


echo " (FSFS)
\n";


} else {


echo " (BDB)
\n";


}


} else {


echo " (BDB)
\n";


}


}


}


closedir( $dh );


}


?>


p>


body>


html>

上述php文档中svnparentpath = "e:/svn";需要注意,您的subversion的代码仓库的根目录可能并不在e:/svn,请修改和您自己配置相同的路径。更改Apache的配置文档http.conf文档,把#LoadModule rewrite_module modules/mod_rewrite.so前面的注释去掉。然后在文档末尾加上如下几句:
RewriteEngine on
RewriteRule ^/svn$ /svn_index.php [PT]
RewriteRule ^/svn/$ /svn_index.php [PT]
RewriteRule ^/svn/index.html$ /svn_index.php [PT]
好了,请从新在浏览器地址栏中输入
http://youserver/svn
,您会发现Apache会把当前Subversion根目录下的任何代码仓库列出来了。如图:
