1、基本 HTTP 认证
最简单的客户端认证方式是通过 HTTP 基本认证机制,简单的使用用户名和密码来验证一个用户的身份。Apache提供了一个
htpasswd 工具来管理一个用户文件,这个文件包含用户名和加密后的密码,这些就是你希望赋予
Subversion 特别权限的用户。htpasswd 可以在 Apache 的 bin
安装目录下找到。具体使用方法如下:
创建用户文件:
htpasswd -c E:\usr\Apache2.2\bin\passwd.conf
username
添加新用户(-m 表示以 MD5 加密密码,可选项):
htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf
Newusername
更改用户密码:
htpasswd [-m] E:\usr\Apache2.2\bin\passwd.conf
username
删除用户(要用大写的 D ):
htpasswd –D E:\usr\Apache2.2\bin\passwd.conf
username
接下来修改 httpd.conf,在 Location 标签中加入如下内容:
AuthType
Basic
AuthName "svn
repos"
AuthUserFile E:/usr/Apache2.2/bin/passwd.conf
Require valid-user
说明:
AuthType Basic:启用基本的验证,比如用户名/密码对。
AuthName "svn repos":当一个认证对话框弹出时,出现在认证对话框中的信息。(最好用英文,TortoiseSVN
不支持中文,安装语言包除外。)
AuthUserFile E:/usr/Apache2.2/bin/passwd:指定E:\usr\Apache2.2\bin\passwd为用户文件,用来验证用户的用户名及密码。
Require valid-user:限定用户只有输入正确的用户名及密码后才能访问这个路径
重新启动 Apache ,打开浏览器访问版本库。Apache 会提示你输入用户名和密码来认证登陆了,现在只有
passwd 文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问,替换上述
"Require valid-user" 为 "Require
user tony robert" 将只有用户文件中的 tony 和 robert
可以访问该版本库。
有的时候也许不需要这样严格的访问控制,例如大多数开源项目允许匿名的读取操作,而只有认证用户才允许写操作。为了实现更为细致的权限认证,可以使用
Limit 和 LimitExcept 标签。例如:
<LimitExcept
GET
PROPFIND OPTIONS REPORT>
require valid-user
</LimitExcept>
以上配置将使匿名用户有读取权限,而限制只有 passwd 中配置的用户可以使用写操作。
如果这还不能满足你的要求,你希望精确的控制版本库目录访问,可以使用 Apache 的
mod_authz_svn 模块对每个目录进行认证操作。
2、用 mod_authz_svn 进行目录访问控制
首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion
的安装目录中找到 mod_auth_svn 模块,将其拷贝到 Apache 安装目录的
modules 子目录下。修改 httpd.conf 文件,添加:
LoadModule
authz_svn_module modules/mod_authz_svn.so
现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz
配置如下:
<Location /repository/>
DAV svn
SVNParentPath e:/svn
# our access control policy
AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf
# try anonymous access first,
resort to real
# authentication if necessary.
Satisfy Any
Require valid-user
# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile E:/usr/Apache2.2/bin/passwd.conf
</Location>
AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定。访问文件
accesspolicy.conf 的语法与svnserve.conf和 Apache
的配置文件非常相似,以(#)开头的行会被忽略;在它的简单形式里,每一小节命名一个版本库和一个里面的路径;认证用户名是在每个小节中的选项名;每个选项的值描述了用户访问版本库的级别:r(只读)或者rw(读写),如果用户没有提到或者值留空,访问是不允许的;
* 表示所有用户,用它控制匿名用户的访问权限;@符号区分组和用户。如:
[groups]
committers = paulex, richard
developers = jimmy, michel, spark, sean
[/]
* = r
@committers = rw
[/branches/dev]
@developers = rw
[/tags]
tony = rw
[/private]
* =
@committers= r
使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录时,其中所有的版本库都将按照这个策略文件配置。例如上例中
tony 将对所有版本库里的 /tags 目录具有读写权限。如果要对具体每个版本库配置,用如下的语法:
[groups]
project1_committers = paulex, richard
project2_committers = jimmy, michel, spark,
tony, Robert
[repos1:/]
* = r
@ project1_committer = rw
[repos2:/]
* = r
@ project2_committer = rw
这样项目1的 project1_committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库
repos2 ,同样项目2的 project2_commiter 组也不能修改 repos1
版本库的文件。
3、用MySQL认证Subversion
环境:
OS:Windows XP SP2
Apache:2.2.6
Subversion:1.4.6
一般情况下,subversion的用户密码文件是以文本文件形式存放在文件系统中的。出于安全性的需要或者单点登陆等可扩展性的考虑,文本文件的管理方式都不能满足需求了。通过
Apache 的 module_auth_mysql 模块,我们可以用 MySQL 来保存用户信息。该模块的主页在
http://modauthmysql.sourceforge.net/,你也可以在 http://modules.apache.org/
找到它的发行版本。安装方法同其它 Apache 的模块一样,拷贝至 modules 目录并在
httpd.conf 文件中添加如下语句:
LoadModule
mysql_auth_module modules/mod_auth_mysql.so
相应的 Location 区域改写为:
<Location /repos/>
AuthName "MySQL Testing"
AuthType Basic
AuthMySQLHost db.kysf.net
AuthMySQLUser svnadmin
AuthMySQLPassword PaSsWoRd #必填项
AuthMySQLDB svn
AuthMySQLUserTable users
AuthMySQLNameField user_name
AuthMySQLPasswordField user_password
AuthMySQLGroupField user_group
AuthMySQLPwEncryption none #必填项
require valid-user
</Location>
其中,
AuthMySQLHost
db.kysf.net
AuthMySQLUser svnadmin
AuthMySQLDB svn
AuthMySQLUserTable users
AuthMySQLNameField user_name
AuthMySQLPasswordField user_password
AuthMySQLGroupField user_group
这7项可以省略。如果省略系统采用默认的值,其默认值如下:
默认值:
AuthMySQLHost
localhost
AuthMySQLUser ODBC
AuthMySQLDB test
AuthMySQLUserTable user_info
AuthMySQLNameField user_name
AuthMySQLPasswordField user_password
AuthMySQLGroupField user_group
然后在 mysql 中添加名为 svn 的数据库,并建立 users 数据表:
create
database svn;
use svn;
CREATE TABLE users (
user_name CHAR(30)
NOT
NULL,
user_password CHAR(20)
NOT
NULL,
user_group CHAR(10),
PRIMARY KEY (user_name)
);
在 users 表中插入用户信息
insert
into users values('username','password','group');
重新启动 Apache,在访问版本库的时候 Apache 就会用 mysql 数据表中的用户信息来验证了。
4、集成用户文件(UserFile)认证和MySQL数据库认证
更改Location 区域:
<Location
/repos/>
DAV svn
SVNListParentPath
on
#SVNPath e:/svn/repos1
SVNParentPath e:/svn
AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf
Satisfy Any
Require valid-user
AuthType Basic
AuthName "MySQL
Auth"
AuthMySQLEnable on
AuthMySQLPwEncryption md5
AuthMySQLAuthoritative off
AuthMySQLHost localhost
AuthMySQLUser svnslt
AuthMySQLPassword list
AuthMySQLDB svn_auth
AuthMySQLUserTable users
AuthMySQLNameField user_name
AuthMySQLPasswordField user_passwd
AuthMySQLGroupTable groups
AuthMySQLGroupField user_group
AuthUserFile E:/usr/Apache2.2/bin/passwd.conf
</Location>
说明:
既可以用数据库中的用户名认证,也可以用文件中的用户名认证。如果数据库认证失败,就由用户文件认证。不过最好把用户文件和数据库中的用户名设为一致,防止单点失败。