技术开发 频道

Subversion高级应用:SVN的多种认证方式

 二、认证选项

  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>

  说明:

  既可以用数据库中的用户名认证,也可以用文件中的用户名认证。如果数据库认证失败,就由用户文件认证。不过最好把用户文件和数据库中的用户名设为一致,防止单点失败。

0
相关文章