也可以使用Apache的httpd模块mod_authz_svn更加细致的设置访问权限,这个模块收集客户端传递过来的不同的晦涩的URL信息,询问mod_dav_svn来解码,然后根据在配置文件定义的访问政策来裁决请求。
如果你从源代码创建Subversion,mod_authz_svn会自动附加到mod_dav_svn,许多二进制分发版本也会自动安装,为了验证它是安装正确,确定它是在httpd.conf
的LoadModule
指示中的mod_dav_svn后面:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
为了激活这个模块,你需要配置你的Location
区块的AuthzSVNAccessFile
指示,指定保存路径中的版本库访问政策的文件。(一会儿我们将会讨论这个文件的格式。)
Apache非常的灵活,你可以从三种模式里选择一种来配置你的区块,作为开始,你选择一种基本的配置模式。(下面的例子非常简单;见Apache自己的文档中的认证和授权选项来查看更多的细节。)
最简单的区块是允许任何人可以访问,在这个场景里,Apache决不会发送认证请求,所有的用户作为“匿名”对待。
在另一个极端,你可以配置为拒绝所有人的认证,所有客户端必须提供证明自己身份的证书,你通过Require valid-user
指示来阻止无条件的认证,并且定义一种认证的手段。
第三种流行的模式是允许认证和匿名用户的组合,举个例子,许多管理员希望允许匿名用户读取特定的版本库路径,但希望只有认证用户可以读(或者写)更多敏感的区域,在这个设置里,所有的用户开始时用匿名用户访问版本库,如果你的访问控制策略在任何时候要求一个真实的用户名,Apache将会要求认证客户端,为此,你可以同时使用Satisfy Any
和Require valid-user
指示。
一旦你的基本Location
区块已经配置了,你可以创建一个定义一些授权规则的访问文件。
访问文件的语法与svnserve.conf和运行中配置文件非常相似,以(#
)开头的行会被忽略,在它的简单形式里,每一小节命名一个版本库和一个里面的路径,认证用户名是在每个小节中的选项名,每个选项的值描述了用户访问版本库的级别:r
(只读)或者rw
(读写),如果用户没有提到,访问是不允许的。
具体一点:这个小节的名称是[repos-name:path]
或者[path]
的形式,如果你使用SVNParentPath
指示,指定版本库的名字是很重要的,如果你漏掉了他们,[/some/dir]
部分就会与/some/dir
的所有版本库匹配,如果你使用SVNPath
指示,因此在你的小节中只是定义路径也很好—毕竟只有一个版本库。
[calc:/branches/calc/bug-142]
harry = rw
sally = r
在第一个例子里,用户harry
对calc
版本库中/branches/calc/bug-142
具备完全的读写权利,但是用户sally
只有读权利,任何其他用户禁止访问这个目录。
当然,访问控制是父目录传递给子目录的,这意味着我们可以为Sally指定一个子目录的不同访问策略:
[calc:/branches/calc/bug-142]
harry = rw
sally = r
# give sally write access only to the 'testing' subdir
[calc:/branches/calc/bug-142/testing]
sally = rw
现在Sally可以读取分支的testing
子目录,但对其他部分还是只可以读,同时,Harry对整个分支还继续有完全的读写权限。
也可以通过继承规则明确的的拒绝某人的访问,只需要设置用户名参数为空:
[calc:/branches/calc/bug-142]
harry = rw
sally = r
[calc:/branches/calc/bug-142/secret]
harry =
在这个例子里,Harry对bug-142
目录树有完全的读写权限,但是对secret
子目录没有任何访问权利。
有一件事需要记住的是需要找到最匹配的目录,mod_authz_svn模块首先找到匹配自己的目录,然后父目录,然后父目录的父目录,就这样继续下去,更具体的路径控制会覆盖所有继承下来的访问控制。
缺省情况下,没有人对版本库有任何访问,这意味着如果你已经从一个空文件开始,你会希望给所有用户对版本库根目录具备读权限,你可以使用*
实现,用来代表“所有用户”:
[/]
* = r
这是一个普通的设置;注意在小节名中没有提到版本库名称,这让所有版本库对所有的用户可读,不管你是使用SVNPath
或是SVNParentPath
。当所有用户对版本库有了读权利,你可以赋予特定用户对特定子目录的rw
权限。
星号(*
)参数需要在这里详细强调:这是匹配匿名用户的唯一模式,如果你已经配置了你的Location
区块允许匿名和认证用户的混合访问,所有用户作为Apache匿名用户开始访问,mod_authz_svn会在要访问路径的定义中查找*
值;如果找不到,Apache就会要求真实的客户端认证。
访问文件也允许你定义一组的用户,很像Unix的/etc/group
文件:
[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane
组可以被赋予通用户一样的访问权限,使用“at”(@
)前缀来加以区别:
[calc:/projects/calc]
@calc-developers = rw
[paint:/projects/paint]
@paint-developers = rw
jane = r
...并且非常接近。