SVN权限配置详解
SVN权限详细配置
本章将详细介绍SVN权限配置涉及的两个配置⽂件, f 和 f,通过对配置逐⾏的描述,来阐明其中的⼀些细节含义。除此之外的其他配置、安装等内容,不是本⽂重点,读者若有什么疑问,请参考后⾯“参考⽂献”中列出的⼀些⽂档。
这⾥⾸先要注意⼀点,任何配置⽂件的有效配置⾏,都 **不允许存在前置空格** ,否则程序可能会出错,给你⼀个 ``Option expected``的提⽰。也就是说,如果你直接从本⽂的纯⽂本格式中拷贝了相关的配置⾏过去,需要⼿动将前置的4个空格全部删除。当然了,如果你觉得⼀下⼦要删除好多⾏的同样数⽬的前置空格是⼀件苦差使,那么也许 UltraEdit 的“Column Mode”编辑模式,可以给你很⼤帮助。
1、f
``SVN\f`` ⽂件,是 这个服务器进程的配置⽂件,我们逐⾏解释如下。
⾸先,我们告诉 ,⽤户名与密码放在f ⽂件下。当然,你可以改成任意的有效⽂件名,⽐如默认的就是 passwd::
password-db = f
接下来这两⾏的意思,是说只允许经过验证的⽤户,⽅可访问代码库。那么哪些是“经过验证的”⽤户呢?噢,当然,就是前⾯说那些在f ⽂件⾥⾯持有⽤户名密码的家伙。这两⾏的等号后⾯,⽬前只允许read write none 三种值,你如果想实现⼀些特殊的值,⽐如说“read-once”之类的,建议你⾃⼰动⼿改源代码,反正它也是⾃由软件::
anon-access = none
auth-access = write
接下来就是最关键的⼀句呢,它告诉 ,项⽬⽬录访问权限的相关配置是放在 f ⽂件⾥::
authz-db = f
当然,svn 1.3.2 引⼊本功能的时候,系统默认使⽤ authz ⽽不是 f 作为配置⽂件。
上述的 f 和 f 两个⽂件也可以作为多个代码库共享使⽤,我们只要将它们放在公共⽬录下,⽐如说放在 ``D:\svn`` ⽬录下,然后在每个代码库的 f ⽂件中,使⽤如下语句::
password-db = ..\..\f
authz-db = ..\..\f
或者::
password-db = ../../f
authz-db = ../../f分组名称
这样就可以让多个代码库共享同⼀个⽤户密码、⽬录控制配置⽂件,这在有些情况下是⾮常⽅便的。
2、f 之⽤户分组
``SVN\f``⽂件的配置段,可以分为两类, ``[group]`` 是⼀类,⾥⾯放置着所有⽤户分组信息。其余以 ``[SVN:/]`` 开头的是另外⼀类,每⼀段就是对应着项⽬的⼀个⽬录,其⽬录相关权限,就在此段内设置。
⾸先,我们将⼈员分组管理,以便以后由于⼈员变动⽽需要重新设置权限时候,尽量少改动东西。我们⼀共设置了5个⽤户分组,分组名称统⼀采⽤ ``g_`` 前缀,以⽅便识别。当然了,分组成员之间采⽤逗号隔开::
[groups]
# 任何想要查看所有⽂档的⾮本部门⼈⼠
g_vip = morson
# 经理
g_manager = michael
# 北京办⼈员
g_beijing = scofield
# 上海办⼈员
g_shanghai = lincon
# 总部⼀般员⼯
g_headquarters = rory, linda
# ⼩秘,撰写⽂档
g_docs = linda
注意到没有, linda 这个帐号同时存在“总部”和“⽂档员”两个分组⾥⾯,这可不是我⽼眼昏花写错了,是因为 Subversion 允许我这样设置。它意味着,这个家伙所拥有的权限,将会⽐他的同事rory 要多⼀些,这样的确很⽅便。具体多了哪些呢?请往下看!
3、f 之项⽬根⽬录
接着,我们对项⽬根⽬录做了限制,该⽬录只允许SVN事业部的经理才能修改,其他⼈都只能眼巴巴的看着::
[SVN:/]
@g_manager = rw
* = r
- ``[SVN:/]`` 表⽰这个⽬录结构的相对根节点,或者说是 SVN 项⽬的根⽬录。其中的SVN 字样,其实就是代码库的名称,即前⾯⽤svnadmin create命令创建出来的那个 SVN。
-
这⾥的 ``@`` 表⽰接下来的是⼀个组名,不是⽤户名。因为⽬前 g_manager 组⾥⾯只有⼀个 michael,你当然也可以将 ``@g_manager = rw`` 这⼀⾏替换成 ``michael = rw``,⽽表达的意义完全⼀样。
- ``*`` 表⽰“除了上⾯提到的那些⼈之外的其余所有⼈”,也就是“除了部门经理外的其他所有⼈”,当然也包括总经理那个怪⽼头
- ``* = r`` 则表⽰“那些⼈只能读,不能写”
4、f 之项⽬⼦⽬录
然后,我们要给总部⼈员开放⽇志⽬录的读写权限::
[SVN:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
这个⼦⽬录的设置有些特⾊,因为从需求分析中我们知道,这个⼦⽬录的权限范围要⽐其⽗⽬录⼩,它不允许除指定了的之外其他任何⼈访问。在这段设置中,我们需要注意以下⼏点:
- 我敢打赌,设计svn的家伙们,⼤部分都是在类 unix 平台下⼯作,所以他们总喜欢使⽤ ``/`` 来标识⼦⽬录,⽽完全忽视在 MS Windows 下是⽤ ``\`` 来做同样的事情。所以这⼉,为了表⽰``diary\headquarters`` 这个⽬录,我们必须使⽤ ``[SVN:/diary/headquarters]``这样的格式。当然如果你⼀定要⽤ ``\`` ,那么唯⼀的结果就是,Subversion 会将你的这部分设置置之不理,全当没看到。
- 这⾥最后⼀⾏的 ``* =`` 表⽰,除了经理、总部⼈员、特别⼈⼠之外,任何⼈都被禁⽌访问本⽬录。这⼀⾏是否可以省略呢?不⾏,因为 **权限具备继承性** ,⼦⽬录会⾃动拥有⽗⽬录的权限。若没有这⼀⾏,则所有帐号都可以读取 ``/diary/headquarters`` ⽬录下的⽂件。因为虽然我们并没有设置这个⽬录的⽗⽬录权限,可是默认的规则使得 ``/diary`` ⽬录的权限与根⽬录完全⼀样,从⽽让其余帐号获得对
``/diary/headquarters`` ⽬录的 r 权限。所以简单来说, ``* =`` 这⼀句的⽬的,就是割断权限继承性,使得管理员可以定制某个⽬录及其⼦⽬录的权限,从⽽完全避开其⽗⽬录权限设置的影响。
- 之所以这⼉需要将 ``@g_vip = r`` ⼀句加上,就是因为存在上述这个解释。如果说你没有明确地给总经理授予读的权⼒,则他会和其他⼈⼀样,被 ``* =`` 给排除在外。
-
如果众位看官中间,有谁玩过防⽕墙配置的话,可能会感觉上述的配置很熟悉。不过这⾥有⼀点与防⽕墙配置不⼀样,那就是各个配置⾏之间,没有 **先后顺序** ⼀说。也就是说,如果我将本段配置的 ``* =`` 这⼀⾏挪到最前⾯,完全不影响整个配置的最终效果。
接下来我们看看这⼀段::
[SVN:/ref]
@g_manager = rw
@g_docs = rw
* = r
这⾥的主要看点,就是 g_docs 组⾥⾯包含了⼀个 linda 帐号,她也同时在 g_headquarters 组⾥⾯出现,这就意味着, linda 将具备对``/ref`` 和 ``diary\headquarters`` 两个⽬录的读写权限。
6、f 之⽬录表⽰法
在前⾯的描述中,我们都采⽤ ``[repos:/some/dir]`` 这样的格式来表⽰项⽬的某个⽬录,⽐如上⼀⼩节中
的 ``[SVN:/diary/headquarters]``。⽽实际上,Subversion允许你采⽤ ```[/some/dir]`` 这样的格式,即不指定代码库的⽅式来表⽰⽬录,此时的⽬录就匹配所有项⽬。
对于使⽤ svnserve 的⽤户来说,只有当 svnserve 运⾏的时候使⽤了 ``-r`` 参数,并且让多个代码库共享同⼀个⽬录权限⽂件(即f 或 authz)时,不指明代码库名称才有可能惹⿇烦。⼀般情况下,我们对每个代码库都会独⽴使⽤配置⽂件,毕竟每个项⽬的⽬录结构,都有很⼤不同,混在⼀起意义不⼤。因此⼀般来说,为简洁起见,都可以不指明代码库名称。本⽂全都指明了代码库名称,主要是为了将来扩展成同⼀个配置⽂件,以⽅便配合 Apache 服务器。
对于使⽤ Apache 的⽤户来说,它们⼆者可有着很⼤的不同,因为此时往往习惯于使⽤⼀个公共的⽬录权限配置⽂件。如果你使⽤了SVNParentPath 指令,则指定版本库的名字是很重要的,因为假若你使⽤后者,那么 ``[/some/dir]`` 部分就会与所有代码库项⽬的
``[/some/dir]`` ⽬录匹配。如果你使⽤ SVNPath 指令,则这两种表⽰⽅式就没有什么区别了,毕竟只有⼀个版本库。
7.1. ⽗⽬录的 ``r`` 权限,对⼦⽬录 ``w`` 权限的影响
把这个问题专门提出来,是因为在1.3.1及其以前的版本⾥⾯,有个bug,即某个帐号为了对某个⼦⽬录具备写权限,则必须对其⽗⽬录具备读权限。因此现在使⽤了1.3.2及其更⾼的版本,就⽅便了那些想在⼀个代码库存放多个相互独⽴的项⽬的管理员,来分配权限了。⽐如说央舜公司建⽴⼀个⼤的代码库⽤于存放所有员⼯⽇志,叫做 diary,⽽SVN事业部只是其中⼀个部门,则可以这样做::
[diary:/]
@g_chief_manager = rw
[diary:/SVN]
@g_SVN_manager = rw
@g_SVN = r
这样,对于所有SVN事业部的⼈员来说,就可以将svn://192.168.0.1/diary/SVN 这个URL当作根⽬录来进⾏⽇常操作,⽽完全不管它其实只是⼀个⼦⽬录,并且当有少数好奇⼼⽐较强的⼈想试着 checkout ⼀下 svn://192.168.0.1/diary 的时候,马上就会得到⼀个警告“Access denied”,哇,太酷了。
7.2. 默认权限
如果说我对某个⽬录不设置任何权限,会怎样?马上动⼿做个试验,将::
[diary:/]
@g_chief_manager = rw
改成::
[diary:/]
# @g_chief_manager = rw
这样就相当于什么都没有设置。在我的 svn 1.3.2 版本上,此时是禁⽌任何访问。也就是说,如果你想要让某⼈访问某⽬录,你⼀定要显式指明这⼀点。这个策略,看起来与防⽕墙的策略是⼀致的。
7.3. 只读权限带来的⼀个⼩副作⽤
若设置了::
[SVN:/diary]
* = r
则 Subversion 会认为,任何⼈都不允许改动diary ⽬录,包括删除、 **改名** ,和 **新增** 。
也就是说,如果你在项⽬初期创建⽬录时候,⼀不⼩⼼写错⽬录名称,⽐如因拼写错误写成 dairy,以后除⾮你改动 f ⾥⾯的这⾏设置,否则⽆法利⽤ svn mv 命令将错误的⽬录更正。
7.4. anon-access 属性对⽬录权限的影响
你想将你的代码库开放给所有⼈访问,于是你就开放了匿名访问权限,在 f ⽂件中添加⼀⾏: ``anon-access=read``。可是对于部分⽬录,你⼜不希望别⼈看到,于是针对那些特别⽬录,你在 f ⾥⾯进⾏配置,添加了授权访问的⼈,并添加了 ``* =`` 标记。你认为⼀切OK了,可是你缺发现,那个特别⽬录却⽆法访问了,总是提⽰ ``Not authorized to open root of edit operation`` 或者 ``未授权打开根进⾏编辑操作`` 。你再三检查你配置的⽤户名与密码,确认⼀切正确,还是⽆法解决问题。
原来,Subversion 有个⼩ bug ,当 ``anon-access=read`` 并且某个⽬录有被设置上 ``* =`` 标记,则会出现上述问题。这个 bug 在当前最新版本上(v1.4)还存在,也许在下⼀版本内可以被改正吧。
解决的办法是,在 f 中,将anon-access 设置成 none 。
8、改进,对中⽂⽬录的⽀持
上午上班的时候,Morson 来到 Michael 的桌⼦前⾯,说道:“你是否可以将我们的北京办、上海办⽬录,改成⽤中⽂的,看着那些拼⾳我觉得很难受?”Michael ⼼想,还好这两天刚了解了⼀些与 unicode 编码相关的知识,于是微笑地回答:“当然可以,你明天下午就可以看到中⽂⽬录名称了。”
8.1. 使⽤ svn mv 指令,将原来的⼀些⽬录改名并commit ⼊代码库,改名后的⽬录结构如下::
SVN
├─⼯作⽇志
│├─总部⼈员
│├─北京办
│└─上海办
├─公司公共⽂件参考⽬录
└─临时⽂件存放处
8.2. 修改代码库的 f ⽂件,将相应⽬录逐⼀改名
8.3. UTF-8 格式的 f ⽂件,以及BOM
将配置⽂件转换成 UTF-8 格式之后,Subversion 就能够正确识别中⽂字符了。但是这⾥需要注意⼀点,即必须保证 UTF-8 ⽂件不包含BOM 。BOM是 Byte Order Mark 的缩写,指 UNICODE⽂件头部⽤于指明⾼低字节排列顺序的⼏个字符,通常是 ``FF FE`` ,⽽将之⽤UTF-8 编码之后,就是 ``EF BB BF`` 。由于 UTF-8 ⽂件本⾝不存在字节序问题,所以对 UTF-16 等编码⽅式有重⼤意义的 BOM,对于UTF-8 来说,只有⼀个作⽤——表明这个⽂件是 UTF-8 格式。由于 BOM 会给⽂本处理带来很多难题,所以现在很多软件都要求使⽤不带BOM 的 UTF-8 ⽂件,特别是⼀些处理⽂本的软件,如、 UNIX 脚本⽂件等,svn 也是如此。
⽬前常⽤的⼀些⽂本编辑⼯具中,MS Windows ⾃带的“记事本”⾥⾯,“另存为”菜单保存出来的 UTF-8 格式⽂件,会⾃动带上 BOM 。新版本 UltraEdit 提供了选项,允许⽤户选择是否需要 BOM,⽽⽼版本的不会添加 BOM。请各位查看⼀下⾃⼰常⽤的编辑器的说明⽂件,看看它是否⽀持这个功能。
对于已经存在 BOM 的 UTF-8 ⽂件,⽐如说就是微软“记事本”弄出来的,我们可以利⽤UltraEdit 来将 BOM 去掉。⽅法是,⾸先利⽤“UTF-8TO ASCII”菜单将⽂件转换成本地编码,通常是GB2312码,然后再使⽤“ASCII TO UTF-8(UNICODE Editing)”来转换到 UTF-8 即可。当然,这么操作之前,你肯定得先保证,你的 UltraEdit 保存出来的 UTF-8 ⽂件的确是不带 BOM 的。
Subversion 为什么讨厌 BOM 呢?我不知道,毕竟我也只是⼀个普通⽤户,不是开发⼈员。如果你感兴趣,并且英⽂够好的话,不妨参考⼀下这个讨论: /ser ... ers&msgNo=51334
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论