Subversion之路--实现精细的目录访问权限控制

来源:互联网 发布:武器设计软件 编辑:程序博客网 时间:2024/06/10 10:53

Subversion之路--实现精细的目录访问权限控制(v1.0 更新于2006.12.05)

(终于提交正稿了,从开始动笔到现在提交正稿,由于私人原因,整整经过了半年时间方才结束,惭愧!对于那些因为本文的错误而走了弯路的网友们,本人深表歉意。
非常感谢各位读者的关注,在这半年时间里面,正是各位的支持,才让我鼓起勇气,持续着将文章写完。
本人其实就是个业余爱好者,不是专业人士,因此文章里面的错误在所难免,希望各位斧正,以免让我混淆视听。)



================
Subversion之路
================
----------------------------
实现精细的目录访问权限控制
----------------------------


:作者: 郑新星
:联系: zhengxinxing <AT> gmail <DOT> com
:状态: 正稿
:版本: 1.0
:修订: $Id: The.Road.to.Subversion_authz.rst 1749 2006-12-05 08:05:59Z zhengxinxing $
:版权:  作者保留对本文的一切修改、发布等权力。任何人想要转载本文部分或全部内容时,必须保留包括作者、联系、状态、版本、修订、版权,共六项信息,并给出出处。对本文的参考引用,则不受限制。

:关键词: Subversion 目录访问 权限

:献辞:

    仅以本文,献给中国广大的自由软件爱好者们

:摘要:

    本文从一个实际的例子入手,介绍了如何利用 Subversion 自带的目录管理功能,来实现对项目目录的精细访问权限的控制。同时描述了在配置的过程中,需要注意的一些地方,如对中文的处理等。


.. section-numbering::
.. contents:: 目 录
   :backlinks: top



前言
====

Subversion 权限简介
-------------------

在 Subversion 的使用当中,存在“认证”、“授权”两个概念。认证,即 authentication,是指用户名与密码的认证。授权,即 authorization ,是指某用户对某个目录是否具备读、写权限的一种审核。这两者配合作用,就组成了 Subversion 的整个帐户管理体系。

在实际的工作当中,我们有时候会遇见需要控制项目目录的访问权限的情况,比如说对项目的一些关键模块进行限制,仅允许少数授权人士才可以修改等。由于项目的目录本身就是作为版本库的一个部分被 Subversion 所收管,所以我们无法利用操作系统的帐户权限体系,来实现授权控制。因此,这个问题就只有让svn自己来解决了。

Subversion 提供了面向目录的帐户权限管理功能,通过它,我们就可以很精确地实现项目目录的访问控制。不过在 1.2 及其以前的版本,我们只能利用 mod_authz_svn.so 模块,结合 Apache 服务器来实现目录访问控制,这对于对 Apache 的配置与使用不是很熟悉的人来说,就不是很方便了。而Subversion终于在 1.3 版本上,在 svnserve.exe 服务器里面添加了这一功能,方便了很多人。


其他信息
--------

本文面向那些 Subversion 的管理员,或者任何对 Subversoin 有兴趣的人们。本文假定读者对Subversion有一定的了解,因此不打算对所有涉及到的安装、使用,做一个细节性的描述。若对于文章中描述的其他细节方面有所疑问,请访问“参考文献”一节里面的参考资料。如果你对本文任何地方有什么意见,或者发现本文有着大大小小的错误,请联系 zhengxinxing <AT> gmail <DOT> com 。


本文是基于 Subversion 1.3.2、MS Windows 2003 Server Edition 平台来编写的,且 Subversion 服务器是利用 svnserve.exe 来架设的。不过,本文讲述到的绝大多数内容,都是不仅与操作系统平台无关,而且与是采用 svnserve(.exe) 还是使用 Apache 来作为 Subversion 服务器也基本无关。因此为免罗嗦,本文就以 svnserve(.exe) 为例进行描述,而略过 Apache 服务器相关的内容,有兴趣的读者可以参考其他文章来在 Apache 服务器下实现类似的功能。

本文是利用 reST 格式来编写的,如果你对它感兴趣,请访问 http://docutils.sourceforge.net/rst.html 。如果想要看到更好的html格式,你可以通篇复制本文到一个文本文件里,然后利用 docutils 的 rst2html.py 脚本编译它,当然,首先你必须安装 python。

本文的获得方式:

  - 原始发布点: http://iusesvn.com/bbs/thread-6-1-1.html
  - 完整源文件,请利用 svn 命令来获取,命令为  ``svn co svn://cvs.woodpecker.org.cn/woodpecker/zqlib/tangle/michael.zheng/road2svn``
  - HTML版式文件,请访问 http://zhengxinxing.googlepages. ... bversion_authz.html (推荐) 或 http://swjr.blog.com.cn/archives ... version1authz.shtml



致谢
====

非常感谢 iusesvn.com 站的站长 PCplayer ,他在本文编写过程中,给我提出了很多宝贵的意见与建议。

感谢 woodpecker.org.cn 提供的 Subversion 空间,让更多的人可以通过 svn 获得本文件。

感谢 google 公司提供的免费主页空间,让我可以放置完全定制的 HTML 文件。


实战
====

本章先直接给出需求及其最终的结果,如果你觉得对配置有什么疑问,或者看不懂,请不要着急,我会在后面的章节详细描述的。


背景假设
--------

厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计、销售,并在北京、上海各设立了一个办事处。对于工作日志,原先采用邮件方式发给经理,但是这种方式有个缺点,那就是不具备连续性,要看以前的日志必须一封一封邮件去查看,很麻烦。于是就想到利用 Subversion, 让员工在自己电脑上编辑日志,然后利用svn传送回来,既方便员工自己编写日志,又方便对日志的归档处理,而且提交日志的时候只需要执行一下 svn commit 即可,比发送邮件还要简单的多。

- svn服务器相关信息

  - 服务器地址: 192.168.0.1
  - 服务器OS: MS Windows 2000 Server Edition 中文版
  - 用于存放日志的代码库本地目录: ``D:/svn/arm``

- arm部门文档的目录结构如下::

    arm                 部门名称
    ├─diary           工作日志目录
    │  ├─headquarters    总部工作日志目录
    │  ├─beijing         北京办日志目录
    │  └─shanghai        上海办日志目录
    ├─ref             公司公共文件参考目录
    └─temp            临时文件目录

- 人员情况

  - morson,公司总经理,不习惯使用电脑,更喜欢传统的纸与笔,以及面对面的交流
  - michael,arm事业部的部门经理,没事的时候喜欢弄点儿新技术,用svn来管理日志,就是他想出来的主意
  - scofield,北京办人员,老员工,为人油滑难管
  - lincon,上海办人员,老员工,大老实人一个
  - linda,总部协调员、秘书,文笔不错,长得也不错
  - rory,单片机技术员,技术支持

- 访问权限需求分析

  - 允许总经理、部门经理读取所有文件。顺便给他们开放写权限,以便体现对他们职位的尊重,虽然对于某些文件来说,他们若拥有“写”权限其实也没什么用处
  - 除部门经理外,所有其他人员,均只能看到本办事处人员工作日志
  - 不允许匿名访问
  - ref目录只允许经理和秘书读写,对其他人只读
  - temp目录人人都可以随意读写


使用 svnserve.exe 作为 Subversion 服务器
----------------------------------------
本节描述如何利用 svnserve.exe 来作为代码库服务器端,实现上述功能。至于另外一种代码库服务器端,即利用 Apache 结合 mod_dav_svn.so 来实现的代码库服务器端,由于其对于本文叙述的内容“实现精细的目录访问权限控制”而言,与前者没有太大的区别,故而略过不提。它们二者只是在初次安装、配置方面存在一些不同,有兴趣的读者,可以参考其他文档,重新实验下述步骤。


启动 Subversion 服务
````````````````````
在服务器端,打开一个命令行窗口,用CD命令进入 Subversion 安装目录下的 bin 目录,运行如下指令::

    svnserve -d -r d:/svn

其中的 -d 参数表示 svnserve.exe 将会作为一个服务程序运行在后台,而 -r 参数表示将 ``D:/svn`` 目录指定为代码库的根目录。这样,当客户端使用类似 svn://192.168.0.1/foo 这样内容的 URL 来访问服务器时候,其所访问到的真实代码库,其实就是 ``D:/svn/foo``

用上述命令行方式启动的 svn 服务有个小缺点,就是在本试验过程中,服务器端必须要一直开着那个运行了上述命令的DOS窗口,不能关闭它。如果不想看到这个窗口,可以将 svnserve 安装成 windows 的一个 services,安装方式请参考其他文章。


建立代码库
``````````
在服务器端的 ``D:/svn`` 目录下,建立一个名为 arm 的代码库,命令如下::

    D:/svn>svnadmin create arm

使用上述命令之后,如果不出问题的话,在 ``D:/svn`` 目录下就会多出一个叫做 ``arm`` 的目录,其下具备 conf、dav、hooks、locks、db 等子目录或文件,此即 **一个名为arm的代码库** 。从此,通过 ``svn://192.168.0.1/arm`` 这样的 URL,我们就可以对这个代码库进行访问了。接下来就要进入本文的正题了,也就是权限配置部分了。

其实进入 ``arm/conf`` 目录你就会发现,它下面已经存在三个写了一些帮助信息和示例的配置文件,以帮助用户尽早掌握其配置方法。这三个默认的配置文件分别是 svnserve.conf、passwd、authz 。其中后两者没有后缀,对于 windows 系统的用户来说,看起来总是有些怪异,所以在接下来的章节里面,我将它们两个都给添加了个 conf 后缀,以便管理。


编辑代码库基础配置文件
``````````````````````
在服务器端,编辑代码库的 ``arm/conf/svnserve.conf`` 文件,如下::

    [general]
    password-db = passwd.conf
    anon-access = none
    auth-access = write
    authz-db = authz.conf


管理用户帐号
````````````
在服务器端,新建 ``arm/conf/passwd.conf`` 文件,如下::

    [users]
    morson = ShowMeTheMoney
    michael = mysecretpassword
    scofield = hellolittilekiller
    lincon = asyouknows111
    rory = 8809117
    linda = IlikeWorldCup2006


建立目录访问权限控制文件
````````````````````````
在服务器端,新建 ``arm/conf/authz.conf`` 文件,内容如下::

    [groups]
    g_vip = morson
    g_manager = michael
    g_beijing = scofield
    g_shanghai = lincon
    g_headquarters = rory, linda
    g_docs = linda

    [arm:/]
    @g_manager = rw
    * = r

    [arm:/diary/headquarters]
    @g_manager = rw
    @g_headquarters = rw
    @g_vip = r
    * =

    [arm:/diary/beijing]
    @g_manager = rw
    @g_beijing = rw
    @g_vip = r
    * =

    [arm:/diary/shanghai]
    @g_manager = rw
    @g_shanghai = rw
    @g_vip = r
    * =

    [arm:/ref]
    @g_manager = rw
    @g_docs = rw
    * = r

    [arm:/temp]
    * = rw


导入代码
````````
在客户机 ``F:/temp`` 目录下,建立好前述“背景假设”一节中描述的目录结构,然后用命令 ``F:/temp>svn import arm svn://192.168.0.1/arm --username michael --password mysecretpassword`` 导入整个目录结构。

这条指令的精确意思是,将 arm 目录下面的所有东西,导入到那个名叫 arm 的代码库中去。如果你不指定源目录,则 svn 会默认将当前目录作为源目录。比如说,你处于 ``F:/temp`` 目录下的时候,直接执行 ``svn import svn://192.168.0.1/arm`` ,那么当你取出你的代码的时候,你会发现,居然多了一层名为 arm 的目录。结果,你就必须使用类似  ``svn://192.168.0.1/arm/arm`` 这样怪异的URL,才能够正确访问到你的代码们。

这一点粗看好像不是特别重要,不过联想到前述的目录授权规则,可都是按照标准的项目目录结构来设计的。突然之间,你项目的根目录之上,多出了一个名为 arm 的目录,那么我们的所有目录授权规则,基本上都要全部改过了,否则除了根目录,你永远会得到一个莫名其妙的“access denied”。由于 Subversion 在这一步骤上的界面不够人性化,因此这是初学者很容易弄混的地方之一。


测试
````
在服务器上,打开一个 DOS Prompt 窗口,输入如下指令::

    svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117

我们应该得到如下目录结构::

    arm
    ├─diary
    │  └─headquarters
    ├─ref
    └─temp

然后修改ref目录下任意文件并提交,服务器将会报错“Access denied”,Bingo!
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝贝头发稀少怎么办 2岁幼儿头发稀少怎么办 小孩头发太少了怎么办 头发少盘丸子头怎么办 油头发掉的厉害怎么办 头顶头发长得慢怎么办 每次洗头发都掉很多头发怎么办 拔了头发不长怎么办 6岁儿童头发稀少怎么办 2岁宝宝胆子小怎么办 坐到小孩的头怎么办 托班幼儿不刷牙怎么办 两岁的宝宝蛀牙怎么办 小孩在学校被打怎么办 油画棒画在墙上怎么办 宝宝把蜡笔吃了怎么办 吃鸡更新了怎么办开始 数字画涂料干了怎么办 广告画颜料干了怎么办 宝宝断奶后瘦了怎么办 腿一个粗一个细怎么办 两条小腿不一样粗怎么办 两岁宝宝坐不了怎么办 q糖孩子吃多了怎么办 q糖孩子吃的太多怎么办 ps图层不能覆盖怎么办 孩子的字写的不好怎么办 孩子爱打人怎么办 6招 一岁宝宝爱打人怎么办 2岁小朋友爱打人怎么办 小朋友爱动手怎么办4岁 5,6岁爱动手打人怎么办 七个月宝宝大便干燥怎么办 两岁宝宝吐奶怎么办 2岁宝宝轻微蛀牙怎么办 2岁宝宝喝水都吐怎么办 2岁宝宝吐的厉害怎么办 两岁宝宝个子矮怎么办 宝宝吐了一天了怎么办 3岁宝宝吃饭呕吐怎么办 3岁宝宝突然呕吐怎么办