版本管理之SVN实践教程:基础篇(3):用户&权限设定

版权声明:本文为博主原创文章,未经博主允许欢迎转载,但请注明出处。 https://blog.csdn.net/liumiaocn/article/details/81942119

这里写图片描述

在上一篇文章中我们搭建了svn服务器以及创建了一个demo仓库,使用匿名用户将这个demo仓库co到了本地。而这篇文章将会来学习一下如何设定相关的用户/组/权限相关信息。

svnadmin create创建了什么

svnadmin create创建了什么?当然是一个仓库。接下来我们就来看一下什么都没有动的时候,创建出来的都是些什么,种棵树,会看的清楚一些:

[root@liumiaocn svn]# docker exec -it svn-server sh
/data/svn # cd demo-repo
/data/svn/demo-repo # ls
README.txt  conf        db          format      hooks       locks
/data/svn/demo-repo # tree .
sh: tree: not found
/data/svn/demo-repo # apk add tree
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tree (1.7.0-r1)
Executing busybox-1.28.4-r0.trigger
OK: 12 MiB in 25 packages
/data/svn/demo-repo # tree .

从这棵树上可以看到大概有10个目录和28个文件构成了初期的仓库结构。
这里写图片描述
接下来我们简单地看一下这些主要的目录和文件

目录 用途说明
conf 当前版本库所使用的配置文件的保存目录
db 版本数据的保存目录
db/revprops 版本属性
db/revs 版本对象文件的实际保存目录
hooks svn提供hook操作,诸如提交之前后者之后所回调的功能相关的模版文件,后续会结合实例进行说明
locks 存储操作锁的目录

缺省方式下的主要模具就是这些,当然如果使用dav模式,还会有dav目录等。而主要的文件以及作用简单说明如下:

文件 用途说明
db/uuid uuid是universal unique IDentifier缩写,用于确定版本库的全局唯一标志。里面会存放多个uuid
db/fs-type 版本库的存储格式,svn支持fsfs和bdb两种方式,缺省是fsfs
format 格式信息,为一个整数。客户端工作目录的拷贝中代表具体的格式是SVN 1.x 比如12表示SVN 1.8的工作拷贝格式,但似乎1.7的一些版本也是12, 不同的版本一般有不同的format的值。
hooks/*.tmpl svn动作生命周期中不同阶段会调用的钩子函数的模版文件
conf/svnserve.conf svn服务配置文件,修正需要svnserve重新启动,容器需要restart
conf/passwd 用户信息设定文件,修改即时生效
conf/authz 权限设定文件,修改即时生效

接下来我们来看一下在上篇文章中svn co的一个空的仓库。svn co和git clone一样,都会生成一个隐藏的文件夹,git会生成一个.git的文件夹,而svn会生成.svn

[root@platform demo-repo]# ls -lart
total 4
dr-xr-x---. 15 root root 4096 Aug 24 20:08 ..
drwxr-xr-x.  3 root root   18 Aug 24 20:08 .
drwxr-xr-x.  4 root root   75 Aug 24 20:08 .svn
[root@platform demo-repo]# cd .svn
[root@platform .svn]# ls
entries  format  pristine  tmp  wc.db
[root@platform .svn]#

可以看到working copy的format是12,

[root@platform .svn]# cat format 
12
[root@platform .svn]# 

使用svn info可以看到整个工作区的基本信息

[root@platform .svn]# cd ..
[root@platform demo-repo]# svn info
Path: .
Working Copy Root Path: /root/demo-repo
URL: svn://192.168.163.129/demo-repo
Repository Root: svn://192.168.163.129/demo-repo
Repository UUID: 4fdba69f-3632-49f7-b5ba-d0491223c588
Revision: 0
Node Kind: directory
Schedule: normal
Last Changed Rev: 0
Last Changed Date: 2018-08-24 20:03:54 -0400 (Fri, 24 Aug 2018)

[root@platform demo-repo]# 

我们可以看到uuid为4fdba69f-3632-49f7-b5ba-d0491223c588
而这些可以结合上述的说明在server侧的db/uuid找到痕迹

[root@liumiaocn ~]# docker exec -it svn-server sh
/data/svn # cd demo-repo/db
/data/svn/demo-repo/db # cat uuid
4fdba69f-3632-49f7-b5ba-d0491223c588
bdc52eeb-e997-4b5c-ad4c-05e833e0db87
/data/svn/demo-repo/db #

设定:svnserve.conf

svnserve.conf是svn服务的配置设定文件,修改需要服务重启才能生效,这里列出最常用的四个选项进行使用说明

设定项 说明 缺省值 备考
anon-access 匿名用户访问权限 read 有read/write/none三种取值
auth-access 认证用户访问权限 write 有read/write/none三种取值
password-db 用户名与密码信息 passwd 多仓库可使用相对路径
authz-db 用户与组权限设定 authz 多仓库可使用相对路径

注意事项1

缺省上述设定都用# 进行了注释,删除时请顺便将左侧的空格删除,不然会提示解析错误

注意事项2

缺省时匿名用户有访问权限,在前面的例子中已经得到验证,没有输入用户名/密码的任何信息,如果没有特殊需求,在实际环境中建议设定为none,因为权限控制svn本身就只有write和read而已。

修改匿名用户权限并确认

因为svn的仓库目录挂载了出来,所以可以直接进行设定文件的修改

[root@liumiaocn data]# ls
demo-repo
[root@liumiaocn data]# cd demo-repo/conf
[root@liumiaocn conf]# ls
authz  hooks-env.tmpl  passwd  svnserve.conf
[root@liumiaocn conf]# vi svnserve.conf 
[root@liumiaocn conf]# grep anon-access svnserve.conf 
### The anon-access and auth-access options control access to the
anon-access = none
[root@liumiaocn conf]#

重启容器

[root@liumiaocn conf]# docker restart svn-server
svn-server
[root@liumiaocn conf]# docker ps |grep svn-server
b90325a88ffc        svn:1.10            "/usr/bin/svnserve..."   7 minutes ago       Up 7 seconds        0.0.0.0:3690->3690/tcp   svn-server
[root@liumiaocn conf]# 

从刚才svn co的本地仓库中,再试图进行svn update取得文件信息,如果有read权限的话是能够执行成功的。

[root@platform demo-repo]# svn update
Updating '.':
svn: E170001: Unable to connect to a repository at URL 'svn://192.168.163.129/demo-repo'
svn: E170001: No access allowed to this repository
[root@platform demo-repo]# 

根据提示可以知道匿名用户已经不再具有缺省的read权限了。接下来将auth-access/password-db/authz-db的注释放开

[root@liumiaocn conf]# ls
authz  hooks-env.tmpl  passwd  svnserve.conf
[root@liumiaocn conf]# vi svnserve.conf 
[root@liumiaocn conf]# egrep 'auth-access|password-db|authz-db' svnserve.conf |grep -v '#'
auth-access = write
password-db = passwd
authz-db = authz
[root@liumiaocn conf]# docker restart svn-server
svn-server
[root@liumiaocn conf]# 

设置用户:passwd

在passwd文件中进行明文用户名和密码的设置,密文方式在后续的文章展开。假设demo-repo项目中有两个开发人员,相关的信息和权限信息如下:

类型 用户名 密码 权限
开发人员 devuser1 devuser1pw read与write
开发人员 devuser2 devuser2pw read与write
测试人员 testuser1 testuser1pw read与write

passwd文件设定方式如下:

[users]
devuser1  = devuser1pw
devuser2  = devuser2pw
testuser1 = testuser1pw

设置权限:authz

权限的设定这里进行最简单的设定,将上述两个开发者分为两批,开发者有两个,设定一个组group_dev,为了介绍如何进行权限的设定,测试用户不在分组。
首先在[groups]段添加group_dev以及和用户的关联信息

[groups]
group_dev = devuser1,devuser2

权限设定的简单规则如下所示:

[版本库:/目录/目录]
用户名 = 权限(r/w/rw)
@组名 = 权限(r/w/rw)

简单设定对于仓库的权限如下,当然展开还可以对于不同目录的用户/组有不同的权限,这里就简单地进行如下设定,demo-repo的/下group_dev组用户都有读写权限,即开发者都有读写权限,测试用户testuser1只有读权限。

[demo-repo:/]
@group_dev = rw
testuser1  = r

使用用户名密码进行co

非交互方式

svn的全局参数设定username和password可以进行密码深证时的设定,比如如下使用一个开发用户进行登录

[root@platform ~]# svn co svn://192.168.163.129/demo-repo --username devuser1 --password devuser1pw

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.163.129:3690> 4fdba69f-3632-49f7-b5ba-d0491223c588

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
Checked out revision 0.
[root@platform ~]#

确认相关信息

[root@platform ~]# cd demo-repo
[root@platform demo-repo]# ls
[root@platform demo-repo]# svn info
Path: .
Working Copy Root Path: /root/demo-repo
URL: svn://192.168.163.129/demo-repo
Repository Root: svn://192.168.163.129/demo-repo
Repository UUID: 4fdba69f-3632-49f7-b5ba-d0491223c588
Revision: 0
Node Kind: directory
Schedule: normal
Last Changed Rev: 0
Last Changed Date: 2018-08-24 20:03:54 -0400 (Fri, 24 Aug 2018)

[root@platform demo-repo]#

添加文件并确认状态

[root@platform demo-repo]# touch first-svn-file
[root@platform demo-repo]# svn add first-svn-file
A         first-svn-file
[root@platform demo-repo]# 

状态A表示添加Add操作,此用户朝svn的demo-repo中添加了一个文件

查看svn log & svn diff

此时确认svn log还无法确认相关操作的内容,只有commit之后才能确认,但是此时使用svn diff却是可以确认一些信息

[root@platform demo-repo]# svn diff
Index: first-svn-file
===================================================================
[root@platform demo-repo]# 

svn commit提交

使用commit命令进行提交

[root@platform demo-repo]# svn commit -m "add first svn file"
Adding         first-svn-file
Transmitting file data .
Committed revision 1.
[root@liumiaocn demo-repo]# svn log
------------------------------------------------------------------------
r1 | devuser1 | 2018-08-24 23:06:31 -0400 (Fri, 24 Aug 2018) | 1 line

add first svn file
------------------------------------------------------------------------
[root@liumiaocn demo-repo]#

只读用户登录

使用testuser1进行登录,因为此用户无write权限,但是因为有read权限,所以应该可以取出刚刚commit的信息

[root@liumiaocn tmp]# svn co svn://192.168.163.129/demo-repo --username testuser1 --password testuser1pw
A    demo-repo/first-svn-file
Checked out revision 1.
[root@liumiaocn tmp]# cd demo-repo/
[root@liumiaocn demo-repo]# ls
first-svn-file
[root@liumiaocn demo-repo]#

确认当前repo的详细信息

[root@liumiaocn demo-repo]# svn info
Path: .
Working Copy Root Path: /tmp/demo-repo
URL: svn://192.168.163.129/demo-repo
Repository Root: svn://192.168.163.129/demo-repo
Repository UUID: 4fdba69f-3632-49f7-b5ba-d0491223c588
Revision: 1
Node Kind: directory
Schedule: normal
Last Changed Author: devuser1
Last Changed Rev: 1
Last Changed Date: 2018-08-24 23:06:31 -0400 (Fri, 24 Aug 2018)

[root@liumiaocn demo-repo]# 

可以看到是在最近的一次修改/用户/时间等相关信息

[root@liumiaocn demo-repo]# svn commit -m "add commit-previllege for test"
Authentication realm: <svn://192.168.163.129:3690> 4fdba69f-3632-49f7-b5ba-d0491223c588
Password for 'testuser1': 
Authentication realm: <svn://192.168.163.129:3690> 4fdba69f-3632-49f7-b5ba-d0491223c588
Username: testuser1
Password for 'testuser1': 

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.163.129:3690> 4fdba69f-3632-49f7-b5ba-d0491223c588

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
svn: E170001: Commit failed (details follow):
svn: E170001: Authorization failed
[root@liumiaocn demo-repo]#

可以看到使用此用户如果不切换的话,即使尝试进行commit,但是也不会成功。

总结

这篇文章应该能够学到使用svn进行最基础的权限设定以及进行一个最基础的提交和确认操作。

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/81942119