收集&分享-

来源:百度文库 编辑:神马文学网 时间:2024/04/28 03:06:11
Windows平台下使用Active Directory对Subversion进行权限控制(非完美解决方案)
目前网上找到的Subversion的配置说明中,关于用户权限控制都是基于 Apache的User文件的或是基于 svnserve.conf文件的,这种配置方式最大的问题在于用户信息保存在独立的文本文件中,维护不便(对用户的添加、修改等必须在服务器上执行,用户自己无法修改密码等),并且无法和其他系统集成。
于是琢磨可不可以用公司现有的Active Directory对Subversion的用户进行权限控制,这样可以解决上面提到的几个问题。
目前已经基本实现了对Subversion使用 Active Directory验证,但是还有一些比较重要的问题没有解决,所以是“非完美解决方案”,放在这里抛砖引玉,希望能够有更好的解决方案。
Apache不能直接调用Active Directory的,只能通过Active Directory提供的LDAP方式进行访问,因此需要在 Apache中打开对LDAP的支持;
Apache中自带了对LDAP的支持(默认情况下没有打开),但是官方自带的 LDAP支持插件在Windows平台下有问题(我这里是经常造成 Apache异常退出,服务终止);因此在Windows平台下需要安装第三方的 LDAP支持插件才可以。
在网上找了一下,发现Apache的 LDAP支持模块有以下几个可供选择(来源:http://nona.net/software/ldap/ ):
名称
网址
mod_auth_ldap
http://nona.net/software/ldap/
mod_auth_ldap
http://httpd.apache.org/docs-2.0/mod/mod_auth_ldap.html
auth_ldap
http://www.rudedog.org/auth_ldap/
mod_auth_ldap
http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html
mod_authz_ldap
http://authzldap.othello.ch/
mod_ldap
http://www.kie.berkeley.edu/people/jmorrow/mod_ldap/
mod_ldap
http://hpwww.ec-lyon.fr/~vincent/apache/mod_ldap.html
我使用的是http://www.muquit.com的 mod_auth_ldap,对其他的没有试过。
一、 安装(假定已经安装了Apache+Subversion )
1.        安装文件的获取:
mm_mod_auth_ldap for MS Windows binary:从 http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html 下载。
由于mm_mod_auth_ldap是基于Sun 的iPlanet C SDK 5.08开发的,运行时还需要iPlanet C SDK 5.08的一些DLL,因此还需要自己下载 iPlanet C SDK 5.08( http://www.sun.com/download/index.jsp?cat=Application Development&tab=3,需要注册才能下载)
2.        安装和设置(来自http://www.chinaunix.net/jh/49/618651.html ):
1)       将上面所说的两个压缩包中的DLL文件复制到Apache 的modules目录中;
2)       在httpd.conf中加入 LDAP 相关模块的配置,就是增加如下一行:
LoadModule auth_ldap_module modules/mod_auth_ldap.dll
二、 配置
如下是httpd.conf中Subversion 段的配置,注意红字的部分就是LDAP的配置信息,具体意义参见注释;其他关于 Subversion和Apache的配置资料请参见网上相关文章(例如http://cube316.net/blog/archives/200512/32 )。

// 常规Subversion配置
DAV svn
SVNListParentPath on
SVNParentPath D:\SVNStore
AuthType Basic
AuthName "Subversion repositories"
# 不能使用svnaccessfile进行配置,原因见后
# AuthzSVNAccessFile conf\svnaccessfile
Require valid-user
# 以下为LDAP配置信息
# LDAP 协议版本,AD提供的LDAP为3
LDAP_Protocol_Version 3
# LDAP 服务器
LDAP_Server 192.168.1.2
# LDAP 服务器端口
LDAP_Port 389
# LDAP 基础DN
Base_DN "dc=MainDC"
# AD 的 LDAP 不允许进行匿名查询,因此需要提供一
# 个 AD 中的用户名及其密码用于 Apache 的LDAP查询
Bind_DN "cn=Administrator,cn=Users,dc=MainDC"
Bind_Pass "password"
# 供 Apache 查询的 AD Object 的属性
UID_Attr "sAMAccountName"
# 允许什么条件的 AD 用户访问 Subversion;
# 这里设置只有scmuser组的用户才可以访问,但是并没
# 有成功,事实上只要是AD中的用户现在都可以访问,
# 不清楚问题出在哪里。
require group "cn=scmuser,ou=groups,dc=MainDC"

这样配置的意图是允许SCMUser中所有用户可以存取 Subversion,其他的用户则不可以,但是事实上这样配置以后的实际结果是AD 中所有用户都可以访问Subversion了,怀疑是require group中的LDAP Filter写的不正确,但是不知道该怎么写,目前就凑合着用了。
三、 问题
使用LDAP可以和其他系统比较好的集成,并且能够方便地对用户进行管理,但是这种方式对于 Subversion很有问题,就是使用这种方式后无法使用AuthzSVNAccessFile 来对Subversion进行目录级别的权限控制,据网上资料说是因为 SVNAccessFile中的用户和组都必须在User 文件中定义(参见http://svn.haxx.se/users/archive-2006-02/0586.shtml 及其相关讨论),我想如果对Apache的授权模块进行自定义修改的话估计是可以的,不过目前我们对此要求不高,所以还暂时能够使用。
四、参考资料
1.        《开发服务器环境配置安装说明》(http://bbs.chinaunix.net/viewthread.php?tid=618651 )
2.        《LDAP authentication module for apache》 http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html
3.        《Subversion Users List Archives》http://svn.haxx.se/users/
标签:C# |  浏览(220) | 评论(1) | 06-12 09:20
Subversion(SVN)安装使用指南
原创作品,转载请注明出处。(摘自:碎片)
※简述※
Subversion是近期在开源社区中非常流行的一款版本控制软件,它是CVS的替代产物。
它的主要特征有:
CVS大部分的功能。 支持“目录”级别的版本管理,并且解决了CVS中迟迟未能解决的文件重命名和移动等问题。甚至对文件或文件夹的属性都提供了版本管理。 “提交(commit)”实现了真正意义上的原子操作。也就是类似数据库中的事务的功能。 版本号依据每次提交而改变,不再针对每个文件。日志信息也是针对每次提交而设置。所以看到版本号是几百或者几千也不用太惊讶,表示方式不一样罢了。 通过WebDAV/DeltaV协议,可以与Apache的网络服务无缝衔接(通过Apache来运行)。这样就能提供一些额外的功能,例如:认证,压缩传输,以及数据仓库(Repository,见下)的浏览等。 也可以作为独立服务器运行,但这样的话提供的功能较为简单薄弱。 两种运行模式都支持SSH(当然需要各自的支持和配置) 降低了分支(Branch)和标签(tag)上的时间消耗。底层设计理念和实现上的不同,不细说了。 时间消耗依据的是文件改变部分的大小,而不是数据总量。 创建数据仓库时,用户可以指定是使用内嵌的 BerkeleyDB 数据库,还是特定格式的文件系统。
其他还有些零星的小功能,具体可以参阅:http://subversion.tigris.org/roadmap.html
这里解释一下 数据仓库 的概念:
一个数据仓库对应的可以是一个项目,也可以是多个项目。SVN是基于数据仓库进行管理的。
按照用户习惯,可以只在每个数据仓库内仅放置一个项目的内容。
※下载※
Subversion 1.2.3:
http://subversion.tigris.org/project_packages.html
(SVN的Server端,分不同操作系统的版本,这里我下载的是for windows及for linux的)
TortoiseSVN:
http://tortoisesvn.tigris.org/download.html
(windows下的SVN客户端,以shell方式集成在系统右键菜单中)
Apache 2.0.55:
http://httpd.apache.org/download.cgi
(视操作系统而下)
※安装使用※
下面说一下安装,分两种平台(windows,linux)及两种模式(与Apache绑定 vs. Stand-alone)
具体在Apache上的配置倒是大同小异。
另外,SVN是支持SSL的,但是这个配置牵涉到其他太多东西,本文就不过多涉及了。真的有需要可以参考SVN的手册(英文)。
方便起见,用几个变量代表具体的值,请自行加以调整:
%SystemRoot% — windows的系统所在目录,一般类似这样:C:\WINNT
%SVN_HOME% — SVN的安装目录
%SVN_REPO_PARENT% — SVN所有数据仓库的根目录(就是存放全部版本文件的总目录)
%PROJECT_NAME% — 项目名,严格的来说它对应的是一个数据仓库,但是这里遵从用户习惯,以项目名称方式来命名。
%SERVER_NAME_OR_IP% — 服务器名或IP地址
%APACHE_HOME% — Apache2的安装路径
另外,安装过程默认使用文件系统做后台数据库,文中不再加以说明。如需使用BerkeleyDB,请自行参考SVN文档。
Windows上的服务器端安装
____________________________________________
1.双击下载得来的”svn-1.2.3-setup.exe”并安装到”%SVN_HOME%”
2.安装完毕后,”%SVN_HOME%\bin”应该已经自动加入到系统路径(%PATH%)中。如果没有,请手工添加。
3.用命令行来测试安装结果是否正确:
cmd svnadmin
如果返回这样的错误信息:”svnadmin.exe - Unable To Locate DLL”,那就需要尝试一下步骤的中的一种或几种:
安装VC++ 6.0(主要是安装VC的运行库)
或者直接从别的机器上拷贝一个”msvcp60.dll”文件到本机的”%SystemRoot%\system32″下
4.使用以下命令创建一个数据仓库,用来存放项目的源代码和其他文件:
cmd svnadmin create %SVN_REPO_PARENT%\%PROJECT_NAME%
5.其中%SVN_REPO_PARENT%是包含所有数据仓库的目录,%PROJECT_NAME%是所创建的数据仓库对应的项目名。
*************************
* 以 Stand-alone 模式运行 *
*************************
6.从命令行启动SVN Server:
cmd svnserve -d -r %SVN_REPO_PARENT%
注意里面的参数 r 限定了浏览全部数据仓库的根目录
当然如果觉得每次这样启动太麻烦的话,也有SVN Serveice的包装程序(http://dark.clansoft.dk/~mbn/svnservice/)。通过它能够以windows service的方式运行SVN Server(其本质还是Stand-alone),运行起来相对比较方便。
7.创建用户数据库(其实就是一个txt文本,就叫它”users.conf”吧,你也可以改名),保存到
%SVN_REPO_PARENT%\%PROJECT_NAME%\conf
目录(那个conf子文件夹在创建数据仓库时已被自动创建好),然后在这个文件内添加需要的用户名和密码。基本的样例如下:
[users] your_username = your_password
注意这里密码是明文存放的,所以也是这种方式的不足之处。
8.在”%SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目录下找到这个”svnserve.conf”文件,用任何文本编辑器打开,为刚才创建的那些用户添加读写权限:
[general] anon-access = none              # 匿名访问权限 auth-access = write             # 认证用户的权限 password-db = users.conf        # 认证用户数据库 realm = Anything you want, but generally we use "%PROJECT_NAME%"   # 在用户认证界面上出现的提示语句
里面的”users.conf”就是刚才在第7步创建的用户文件。
9.最后,重启SVN Server(什么?你不知道怎么重启?关掉窗口再重新用命令行启动啦;包装成Service的话么就更加简单了)
现在已经可以使用客户端来连接SVN Server,进行import等操作了。
连接Server的URL应该是类似这样的:
svn://%SERVER_NAME_OR_IP%/%PROJECT_NAME%
具体步骤,请参阅第20步。
************************
* 以Apache的模块方式运行 *
************************
10.首先要了解的是SVN设计的时候只考虑了兼容Apache2.x,所以在Apache1.x下是不能正常工作的。
11.安装Apache2
如果事先启动了IIS之类的其他webserver,请先停止那些服务(端口被占用会导致Apache安装失败)。
其他问题可以参考Apache的安装手册。
这里假设安装目录为:%APACHE_HOME%
12.检查Apache2的安装是否成功
打开浏览器,访问: http://localhost/
如果出现的是默认的欢迎页面,那就没有问题了。否则请仔细检查,重新安装。
13.打开Apache的配置文件: “%APACHE_HOME%\conf\httpd.conf”
查找”LoadModule”这个关键字,找到导入模块的区块(section)
反注释掉下面这样,从而加载Subversion所需要的DAV模块:
# LoadModule dav_module modules/mod_dav.so
完成之后看起来应该是这样:
LoadModule dav_module modules/mod_dav.so
另外在这行下面再添加两行(请注意把路径中的”\”替换成”/”):
LoadModule dav_svn_module %SVN_HOME%/bin/mod_dav_svn.so LoadModule authz_svn_module %SVN_HOME%/bin/mod_authz_svn.so
特别需要注意的是:由于模块依赖关系,这三行的出现顺序千万不能颠倒。
14.再来配置一下”httpd.conf”的其他部分,告诉Apache2 SVN的数据仓库所在。
(为避免不必要的麻烦,所有路径中的”\”都请替换成”/”)
注意:
按照下述配置,所有数据仓库将共享密码文件及权限文件 如果需要为每个数据仓库创建独立的设置,请查阅SVN的文档(”Authorization Option”章节)
添加下述内容:
  DAV svn   SVNParentPath %SVN_REPO_PARENT%   #设置通过浏览器访问Repository时的XML格式文件,可以省略   SVNIndexXSLT "/svnindex.xsl"   # 存取权限控制文件所在地   AuthzSVNAccessFile %SVN_REPO_PARENT%/AccessFile       # 先尝试匿名操作,如有必要再转向用户认证   Satisfy Any   Require valid-user       # 如何验证用户   AuthType Basic   AuthName "Anything you want, but generally we use %PROJECT_NAME%"   AuthUserFile %SVN_REPO_PARENT%/passwd   #输出时调用Apache的Deflate模块,必须有启用此模块才能这样配,否则删除此行   SetOutputFilter DEFLATE
这里涉及到两个文件: “%SVN_REPO_PARENT%/AccessFile” 及 “%SVN_REPO_PARENT%/passwd”.
并不一定非要放到”%SVN_REPO_PARENT%”目录下,我图方便而已。觉得不安全可以移到另外地方。
这两个文件里面具体内容的设置请参考第16和17步。
15.保存”httpd.conf”并退出,这里Apache2的配置告一段落。
16.”%SVN_REPO_PARENT%/AccessFile”文件的内容
[/] * = r user1 = rw user2 = r admin = rw [%PROJECT_NAME%:/src/test] user2 = rw
其中:
[/] 指代所有数据仓库的根目录,匿名用户默认的权限为只读。 对于”user1″和”admin”,他们对所有数据仓库都有读写权限。 对于”user2″,它对所有数据仓库仅有只读权限。但是下方又额外指定了他对”%PROJECT_NAME%:/src/test”目录具有读写权限。 综上,他对’test’目录及其子目录(自动继承,除非特别指定) 具有读写权限,其他则均为只读权限。
你可以根据需要来设定不同的权限,更详细的说明还需要参考SVN文档中的权限设置章节。
17.”%SVN_REPO_PARENT%/passwd”文件的内容
这个文件是通过”%APACHE_HOME%\bin\htpasswd.exe”自动生成的:
cmd cd /D %APACHE_HOME%\bin # 参数c仅在第一次运行时使用,用来创建一个新文件 htpasswd –cm %SVN_REPO_PARENT%\passwd user1 # 以后添加用户可用此命令,参数m表明需要加密 htpasswd –m %SVN_REPO_PARENT%\passwd user2
此时用文本编辑器打开”%SVN_REPO_PARENT%/passwd”,可以看到里面内容是类似这样的:
admin:$apr1$HLWV7/..$upZwVGvge0sc28fEp7mGM0 user1:$apr1$8sbRo...$hNMdkTvO4t8POVmOkV3Vg. user2:$apr1$ZXzcE/..$5Ir0V8VQQtNYTNnnOp.EU1
18.把SVN自带的XSLT文件拷贝到网站根目录,
然后设置合理权限(windows平台则不必考虑)
#这里假设你的网站根目录是  /var/www/html mv /tmp/subversion-1.2.3/tools/xslt/svnindex* /var/www/html chown apache:apache /var/www/html/svnindex* chmod 644 /var/www/html/svnindex* #设置所有者和权限(将权限赋给apache运行的用户身份) chown -R  apache:apache %SVN_REPO_PARENT% chmod -R  766 %SVN_REPO_PARENT%
19. 重启Apache2服务:
cmd net stop Apache2 net start Apache2
20.打开浏览器,访问:http://%SERVER_NAME_OR_IP%/svn/
如果返回的页面是”403 Forbidden”,可能是由于Apache2默认没有打开目录的浏览权限(Option Indexes,参阅Apache2文档),但这并不影响使用。
现在已经可以用客户端导入项目并开始使用了。
具体步骤,请参阅第20步。
***********************************************
* 注意:以下步骤/命令需要在装有SVN客户端的机器上执行 *
* Windows下安装服务器端的时候已经同时安装了客户端 *
* Linux下尚待查证。 *
***********************************************
21.和CVS一样,SVN在最初的时候需要将已有项目导入到数据库中。
从命令行执行以下命令(Stand-alone):
svn import c:\temp\myproject svn://%SERVER_NAME_OR_IP%/%PROJECT_NAME% -m "initial import" --username your_username --password your_password
或者(Apache2 module):
svn import c:\temp\myproject http://%SERVER_NAME_OR_IP%/svn/%PROJECT_NAME% -m "initial import" --username your_username --password your_password
其中:
A) c:\temp\myproject里面包含了你所要导入的项目文件的内容
B) %SERVER_NAME_OR_IP%是SVN Server的名字或者IP地址,上面存有第5步中创建的数据仓库
C) %PROJECT_NAME%是要导入到的数据仓库名称,这里选择跟项目名一致
D) 参数 m 表明此次导入操作的注释,SVN的注释是按每次提交来定义的,导入也是提交的一种。
E) your_username和your_password是第7和17步创建的用户及密码,注意该用户必须对上面的%PROJECT_NAME%数据仓库有写权限才能成功。
22.然后,需要从Server端再次checkout到本地:
(这点感觉不是太方便,为啥不做成import的时候有个选项,本地目录可以自动生成版本信息呢?)
cmd cd /D anywhere_you_want_to_put_your_versioned_project_files svn co svn://myserver/myproject/trunk . --username your_username --password your_password
注意:
“co”是”checkout”的一个别名
那个点[.]代表当前目录,checkout出来的文件会自动放到这个目录下。也可以改为某个绝对路径。
23.对于向SVN Serer增加,移动,删除,或者修改后提交某些文件,参考使用以下命令:
Add:    svn add src/myfile.java -m "adding a file" Move:    svn move src/myfile.java src/mynewfile.java -m "moved myfile.java to mynewfile.java" Delete:    svn delete src/myfile.java -m "removing a file" Commit:    svn commit src/myfile.java -m "the message"
对于上面的客户端操作,如果安装了TortoiseSVN,一切就变得简单多了。
不过这个就要抓图来说明了。等有空的时候再放上来。