摘要: 设计并实现一个基于Web的SVN权限管理系统,完成SVN用户权限综合分析、权限信息编辑、分级授权等功能,并在前端提供基于用户/组和基于存储库路径两种查看机制。结尾。 简化SVN权限管理。
关键词:SVN; 访问控制; 权限分析; 分级授权
随着软件开发规模的不断扩大和开发复杂度的不断提高,软件配置管理[1]在软件工程领域的地位得到了很大的提升。 软件配置管理 SCM(Software Configuration Management)是一种识别、组织和控制修改的技术。 它确保变更得到正确实施并向相关人员报告。 将软件配置管理应用到整个软件开发过程中,提高了软件开发的效率。
软件配置管理活动需要明确的角色、职责和权限定义。 一般情况下,组织内的所有人员都应该根据系统授予的权限执行相应的操作。 因此,一个好的软件配置管理工具应该能够准确地分析角色权限。 SVN(Subversion)允许权限管理员手动编辑各个版本库的权限配置文件[2],实现权限管理。 然而,随着用户数量的不断增加,依靠极少数管理员手动维护配置文件将变得困难。 这体现在用户数量的增加,使得权限配置文件的内容过多,增加了管理员理解和管理的难度,并且不允许普通用户配置权限时,管理员的数量往往会减少极其有限; 依靠手动操作配置文件很容易引入冗余和其他错误信息,并且无法保证文件内容的简洁性和正确性; 缺乏友好、简洁的可视化管理界面等。
本文基于SVN权限配置文件,设计并实现了一个基于Web的SVN权限管理系统,该系统提供以下功能:自主开发权限解析模块,准确解析所有存储库中的用户权限(也可以分布多个存储库)信息,提供多种查看机制来查看和管理解析结果; 检测并避免冗余和错误信息,保持权限配置文件简洁; 允许用户分层授权[3],让项目的每一个成员都可以充当SVN的权限管理者,更好的配合项目开发。
1 SVN及其管理工具的研究现状
SVN 是一个开源版本控制系统,用于管理随时间变化的数据。 该数据被放置在版本库[2](Repository)中。 版本库会记录每一个文件和目录的变更,您可以将数据恢复到旧版本或浏览数据变更历史。
SVN的工作流程如下:用户通过客户端向服务器发出请求。 通过身份验证后,他可以向SVN服务器指定的存储库目录提交工作副本java用户角色权限设计,或者从存储库中检索所需的文档或代码等数据。 在进行Checkout、Update、Commit等各种操作时java用户角色权限设计,仍然需要进行权限验证,检查用户是否对当前目录下的文件有读写权限。
权限验证是SVN服务器的工作,贯穿于SVN运行的整个过程。 传统的Subversion权限管理是通过手动维护文本配置文件来完成的,费时、费力、且容易出错。 近年来,国内外相继开发出针对SVN服务器的管理工具。 其中,国外的VisualSVN Server[4]集成了Subversion和Apache,开始实现SVN的WEB管理,并提供了包括权限管理在内的可视化界面,提高了操作的友好性,但权限和用户信息管理还不够完善。仍处于控制之中。 掌握在极少数经验丰富的 SVN 服务器管理员手中; 国内SVN俱乐部开发的“SVN管理器[5]”允许用户注册、远程修改个人信息和查看个人权限,并提供基于存储库级别和目录级别的远程权限。 设置等; 开源软件“Submin”提供基于Web浏览器的SVN管理界面。 其功能包括用户和用户组的管理、路径权限的设置等,兼容各种浏览器,界面更加优化。
但由于权限管理的困难,上述工具的使用者仍然是少数具有相关知识的专业管理员,使得这些工具的使用不太普遍。 本系统致力于优化SVN权限管理。 一方面,从不同视角提供更全面的权限信息,提高交互性; 另一方面,它支持分级授权,这将大大降低权限管理的难度。
2 SVN权限管理系统设计
SVN权限管理系统的设计框架如图1所示。
系统总体分为两大模块:权限分析模块和权限信息维护模块。 前者用于读取并解析多个仓库(分布式仓库也可以)的配置文件,整合各个文件的解析结果,并发送给客户端浏览器; 后者涉及权限配置文件的维护,包括组信息和权限规则的修改,还包括冗余信息的检测和避免。 该模块执行的操作最终都会更新到各个配置文件中。
2.1 SVN权限解析模块设计
传统上,SVN客户端与服务器交互的方式是用户在客户端输入用户名和仓库路径,然后提交给服务器。 服务器解析用户是否对该路径有读取权限,如果有,则将内容(包括文件和文件夹)显示给用户,否则告知用户没有权限访问。
本系统将在权限解析方面做出如下改进:客户端只需要给出用户名,不需要仓库路径,并依靠权限解析模块解析出该用户拥有权限的所有路径信息(包括路径)多个相关存储库。 路径上的名称和权限)。
2.1.1 权限配置文件介绍
SVN的权限配置信息保存在一个文本文件中(默认路径是各个版本库的“conf”子目录下的“authz”文件)。 以下是权限文件的一部分(“#”表示单行注释):
###组定义
[团体]
组=用户1,用户2
###基于仓库路径的授权方法
[存储库:/子路径]
用户=r
@组=rw
*=
[仓库:/子路径/abc]
用户3=r
用户3=w
权限配置文件的内容包括组定义和权限规则定义。 组定义以“[groups]”开头,定义格式为“组名=用户名1,用户名2...”。 组之间允许嵌套; SVN采用基于存储库路径的显示[6]如何定义用户权限。 对于仓库“Repo”下的“SubPath”子路径地图场景,用户“user”具有只读权限,组“group”具有读写权限('@'为组标识),其他用户('* ' 指的是除了“除“用户”和“组”之外的用户(包括匿名用户)不具有任何权限。另外3D道具,用户权限是“可继承的”,即如果子权限下的用户权限不发生变化,路径下,用户对子路径的权限会继承父路径的权限,例如,用户对“[Repo:/SubPath/abc]”继承了“[Repo:/SubPath]”的读权限。 SVN授权的本质就是权限之间的“覆盖”,比如“user=w”会覆盖“user=r”,这样“user3”就只有“[Repo:/SubPath/abc]”的写权限。
2.1.2 权限解析类图设计
根据2.1.1节的内容,设计的权限解析模块的类图如图2所示(仅给出了权限解析所需的类、成员变量和方法)。
其中,“User”类和“Group”类分别代表用户和组; “AccessLevel”类代表权限,只允许四种权限:Read(只读)、Write(只写)、ReadAndWrite(读写)和NoneAccess(无读写权限); “AccessRule”类表示权限规则(例如“user=rw”); “RepoPath”类表示存储库路径,定义格式为“[存储库名称:/子路径]”; “AccessRulesUnit”类代表一个存储库路径及其下的若干规则集(如2.1.1节配置文件内容中的部分),是体现“基于路径的授权”的基本单元;“AccessManager” class是一个权限管理类,包含了几乎所有权限解析和管理的方法,执行“AccessManager”构造函数会将配置文件中的所有组定义封装到“groupList”中,将权限规则定义封装到“unitList”中。
2.1.3 权限解析核心方法实现
“AccessManager”类中的“parseRootPaths”和“parseLevel”方法是权限解析的核心方法。 “parseRootPaths”方法会解析出配置文件中给定用户(或组)拥有权限的所有存储库路径(考虑到路径之间权限的继承性,只需解析同一存储库下的路径集合只需获取顶级路径即可); “parseLevel”方法用于确定指定用户(或组)对指定存储库路径的权限。
上述两个方法能够正确执行的前提是“AccessManager”中的“sortUnitList”方法已经被调用(作为权限解析之前的预处理工作,见图1),这样“unitList”中的所有“AccessRulesUnit”对象都可以将它们排列起来,以尽量减少权限解析的难度。这里的“排序”规则如下:从“unitList”中删除“AccessRulesUnit”对象中的所有“RepoPath”成员,使得所有“RepoPath”都按照顺序存储到仓库名称,并保证同一个仓库下的子路径排列在父路径之前,路径“有序”排列的例子是:
[Repo1:/子路径/abc]
[Repo1:/子路径]
[回购1:/]
[Repo2:/子路径/abc]
[回购2:/]
[/]###是所有仓库路径的根目录
“RepoPath”的排序顺序是其位于“unitList”中的“AccessRulesUnit”对象的顺序。
“parseRootPaths”方法(参数以user为例,也可以使用group)如下(用java语言描述):
列出 parseRootPaths(用户 user){
if(isEmpty(unitList)) 返回 null;
列表pathList=new LinkedList();
RepoPath currentPath=firstElem(unitList).path;
/*add用于判断是添加元素还是覆盖pathList中的元素*/
布尔添加=假;
for(AccessRulesUnit 单元:unitList){
RepoPath 路径=unit.path;
if(!isInSameRepository(当前路径,路径)){
添加=真;
当前路径=路径;
AccessRule规则=
新的 AccessRule(用户, 读取级别);
if(unit.hasAccessRule(规则)){
/*add为true,说明之前已经找到了顶级路径或者当前扫描到新版本库的路径*/
if(添加|| isEmpty(pathList))
addElem(pathList, 路径);
/* false 表示当前找到了更高级别的路径,并且应该覆盖找到的最后一个路径(即 pathList 中的最后一个元素) */
否则replaceLastElem(pathList, 路径);
添加=假;
继续;
/*当前单元不包含rule,表示当前pathList
最后一个元素是顶级路径*/
添加=真;
返回路径列表;
“parseLevel”方法(参数以user为例,group也可以)伪代码如下(用java语言描述):
AccessLevel parseLevel(用户用户,RepoPath路径){
布尔值 findPathOrParentPath = false;
for(intindex = 0;index<unitList.size();index++){
AccessRulesUnit 单元 = unitList.get(index);
if(!unit.hasPathOrParentPath(路径)){
/*如果findPathOrParentPath为true,则表示已经检查了与path相同版本库中的所有路径。 由于“sortUnitList”方法已经执行完毕,后续不在同一版本库的路径就不需要再检查了。 直接跳转到unitList的最后一个元素(可能包含“[/]”)即可*/
if(findPathOrParentPath){
索引=unitList.size()-1;
单位 = unitList.get(索引);
if(!unit.hasPath(new RepoPath("[/]")))
休息;
}否则继续;
findPathOrParentPath = true;
if(unit.hasUser(用户)){
//返回包含user的规则中的权限
return unit.getRule(user).level;
if(unit.hasAnonymousRule()){
return unit.getAnonymousRule().level;
返回无访问;
执行以上两个方法可以保证在做权限解析时,在最坏的情况下(T(n)=O(n),n为unitList的长度)最多可以迭代访问一次“unitList”。 与无优化策略相比,(T(n)至少为O(n2)),大大降低了解析难度,避免了对“unitList”的多次迭代访问。
2.2 权限信息维护模块设计
2.2.1 分级授权与权限撤销
传统上,权限配置是由专门的SVN管理员完成的,而本系统的改进实现了分级配置、分级授权和权限撤销。
分级授权是一种分散权限配置工作的方法。 目的是减轻管理员的压力,让每个用户充分参与其中,更好地配合软件开发过程。 通过分层授权,该系统无需依赖专门的SVN管理员。 用户可以将自己对路径的访问权限授予其他人(所有用户/组对任何人都是可见的,但不是每个人都可以修改用户/组信息。),每个项目组成员都可以成为权限管理员,从根本上简化了SVN权限管理工作。
关于权限的撤销,为了防止配置混乱,用户的权限只能由授予者撤销。 如果用户之前已向其他人授予过权限,则会进行权限的级联撤销。
2.2.2 避免冗余的权限规则
频繁的授权操作表明权限文件的内容不断增加,也容易出现冗余的权限规则。 考虑以下情况:
(1)重复定义造成的冗余。 例如,在2.1.1节的配置文件内容中添加以下规则:“user=r”或“@newGroup=r(‘newGroup’组包含‘user’用户)”。
(2)权限覆盖导致的冗余(参见2.1.1节配置文件内容,“user=w”覆盖了“user=r”,使后者成为无效的冗余规则)。
为了保持权限文件的内容简洁、清晰,优化查询权限的效率并避免引入冗余信息非常重要。 本文采用的方法是在授权前调用“AccessManager”中的“parseLevel”方法来检查授权用户是否对该路径具有相同的权限。 如果是这样,则无需授权。
3 SVN权限管理系统界面管理
登录本系统后的界面如图3、图4所示(当前登录的是系统中最具权限的管理员)。
前端界面主要使用JQuery EasyUI(一组基于jQuery的UI插件)中的Treegrid、Datagrid、Tabs、Dialog等组件,提供清晰友好的交互界面。
本系统前端界面的改进是提供了两种视图机制来管理用户权限,包括用户/组视图和存储库路径视图。 图 3 显示了用户/组视图。 对于当前选择的用户/组,通过解析模块,会给出具有权限的存储库的顶级路径集合以及对应的权限。 图 4 是存储库路径视图。 对于选定的存储库路径,会解析该路径上拥有权限的所有用户/组及其对应的权限。 两种视图机制都允许用户配置权限(采用分层授权的思想),提高了系统与用户的交互性,降低了权限管理的难度。
传统的SVN用户权限管理是通过维护文本配置文件来完成的。 用户数量的增加使得依靠少数管理员手动理解和维护配置文件变得困难。 本文在深入理解SVN权限配置的基础上,设计并实现了一个基于Web的SVN权限管理系统,为用户提供更全面的权限信息; 它提出采用基于角色的分层授权机制,使每个项目组都可以独立管理该组。 用户权限; 前台提供基于用户/组和基于仓库路径两种查看机制,让权限管理更简单、直观。
参考
[1] 王强,曹汉平,贾素玲。 IT软件项目管理[M]. 北京:清华大学出版社,2005。
[2] 本·柯林斯-苏斯曼、布莱恩·W·菲茨帕特里克、C·迈克尔·皮拉托。 Subversion 权威指南(适用于 Subversion 1.7)[M/OL]。 2004年。
[3]郭军.基于角色的访问控制分层授权管理研究[D]. 西安:西安电子科技大学,2012。
[4]季周鹏,赵菲菲。 可视化版本控制在.Net三层架构开发中的应用[J]. 软件指南,2013(1):89-90。
[5]SVN俱乐部。 SVN管理器(Windows版本)项目[EB/OL]。 http://,[2012 年 02 期]。
[6] 曾绍庚. Linux SVN服务器权限精准控制的实现[J]. 信息与计算机(理论版),2011(7):163-164。