gbk

Subversion的自助密码修改(windows、linux均通过)

Subversion的自助密码修改(windows、linux均通过)

99lingbo 发表于: 2007-9-19 15:38 来源: 我用Subversion

Subversion是一个很好的版本管理软件,相比CVS,它可以依托于Apache运行,从而巧妙的绕开非80端口的防火墙的限制。同时,它还具有很 多优秀的功能,如支持文件移动等。因此,作为后起之秀,其已经在市场上占据了一席之地,如:apache、gcc等开源软件已经开始使用 Subversion作为其版本管理软件。
这里我们要解决的问题就是如何让用户自助修改用户密码的问题。
典型的Subversion配置如下:

<Location /svn>
DAV svn
SVNParentPath e:/svn

# our access control policy
AuthzSVNAccessFile e:/svn/config/svnaccess.conf

# only authenticated users may access the repository
Require valid-user

# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile e:/svn/config/htpasswd.conf
</Location>

这里,使用了SVNParentPath以便能够支持多个库,其版本库位于e:/svn下,认证文件为e:/svn/config/htpasswd.conf,授权文件为e:/svn/config/svnaccess.conf
针对这个配置,我们如果需要修改用户密码,典型的操作就是执行htpasswd.exe,如:htpasswd -b username password
我们要做的也就是如何将这个在web上来实现。

介绍完基本支持,下面直接说明我的实现方式。
1、在Apache中增加一个别名,如:svntools,设置该路径访问需要认证,认证文件为Subversion的认证文件。
Alias /svntools "E:/svn/svntools/"
<Directory "E:/svn/">
Require valid-user

# how to authenticate a user
AuthType Basic
AuthName "Subversion Tools"
AuthUserFile e:/svn/config/htpasswd.conf
</Directory>

2、编写index.php文件,内容如下:
<?
/*
Alias /svnmodify "E:/svn/"
<Directory "E:/svn/">
Require valid-user

AuthType Basic
AuthName "Subversion Tools"
AuthUserFile e:/svn/config/htpasswd.conf
</Directory>
*/
?>
<?
$username = $_SERVER["PHP_AUTH_USER"]; //经过 AuthType Basic 认证的用户名
$authed_pass = $_SERVER["PHP_AUTH_PW"]; //经过 AuthType Basic 认证的密码
$input_oldpass = (isset($_REQUEST["oldpass"]) ? $_REQUEST["oldpass"] : ""); //从界面上输入的原密码
$newpass = (isset($_REQUEST["newpass"]) ? $_REQUEST["newpass"] : ""); //界面上输入的新密码
$repeatpass = (isset($_REQUEST["repeatpass"]) ? $_REQUEST["repeatpass"] : ""); //界面上输入的重复密码
$action = (isset($_REQUEST["action"]) ? $_REQUEST["action"] : ""); //以hide方式提交到服务器的action

if($action!="modify"){
$action = "view";
}
else if($authed_pass!=$input_oldpass){
$action = "oldpasswrong";
}
else if(empty($newpass)){
$action = "passempty";
}
else if($newpass!=$repeatpass){
$action = "passnotsame";
}
else{
$action = "modify";
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Subversion 在线自助密码修改</title>
</head>
<body>

<?
//action=view 显示普通的输入信息
if ($action == "view"){
?>
<script language = "javaScript">
<!--
function loginIn(myform)
{
var newpass=myform.newpass.value;
var repeatpass=myform.repeatpass.value;

if(newpass==""){
alert("请输入密码!");
return false;
}

if(repeatpass==""){
alert("请重复输入密码!");
return false;
}

if(newpass!=repeatpass){
alert("两次输入密码不一致,请重新输入!");
return false;
}
return true;
}
//-->
</script>
<style type="text/css">
<!--
table {
border: 1px solid #CCCCCC;
background-color: #f9f9f9;
text-align: center;
vertical-align: middle;
font-size: 9pt;
line-height: 15px;
}
th {
font-weight: bold;
line-height: 20px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-bottom-style: solid;
color: #333333;
background-color: f6f6f6;
}
input{
height: 18px;
}
.button {
height: 20px;
}

-->
</style>
<br><br><br>
<form method="post">
<input type="hidden" name="action" value="modify"/>
<table width="220" cellpadding="3" cellspacing="8" align="center">
<tr>
<th colspan=2>Subversion 密码修改</th>
</tr>
<tr>
<td>用 户 名:</td>
<td align="left"> <?=$username?></td>
</tr>
<tr>
<td>原 密 码:</td>
<td><input type=password size=12 name=oldpass></td>
</tr>
<tr>
<td>用户密码:</td>
<td><input type=password size=12 name=newpass></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type=password size=12 name=repeatpass></td>
</tr>
<tr>
<td colspan=2>
<input onclick="return loginIn(this.form)" class="button" type=submit value="修 改">
<input name="reset" type=reset class="button" value="取 消">
</td>
</tr>
</table>
</form>
<?
}
else if($action == "oldpasswrong"){
$msg="原密码错误!";
}
else if($action == "passempty"){
$msg="请输入新密码!";
}
else if($action == "passnotsame"){
$msg="两次输入密码不一致,请重新输入!";
}
else{
$passwdfile="E:"svn"config"htpasswd.conf";
$command='"D:"Program Files"Apache Group"Apache2"bin"htpasswd.exe" -b '.$passwdfile." ".$username." ".$newpass;
system($command, $result);
if($result==0){
$msg="用户[".$username."]密码修改成功,请用新密码登陆.";
}
else{
$msg="用户[".$username."]密码修改失败,返回值为".$result.",请和管理员联系!";
}
}

if (isset($msg)){
?>
<script language="javaScript">
<!--
alert("<?=$msg?>");
window.location.href="<?=$_SERVER["PHP_SELF"]?>"
//-->
</script>
<?
}
?>
</body>
</html>

OK,只要你的apache支持Php,那么使用这个上面这段脚本就能很好的实现自助修改的功能了。
核心思想是:
1、利用Subversion的认证文件对上述脚本进行认证,因此能够确保只有经过认证的用户才能访问此脚本
2、当Apache认证用户通过后,会将认证信息保存到$_SERVER数组中,用户名为:$_SERVER["PHP_AUTH_USER"],密码 为:$_SERVER["PHP_AUTH_PW"]。如此使得我们能够知道是哪一个用户要修改自己的密码以及用户的原密码。
3、利用php能够执行系统命令的功能,根据上述信息和用户输入拼出要执行的命令字符串,使用System()函数进行执行htpasswd.exe,从而达到修改密码的作用。



最新回复

99lingbo at 2007-9-19 15:41:26
大家在linux 上测试一下
windows上已经通过,
只需要有Apache ,php5就可以了
谢谢,因为我这里没有linux环境
99lingbo at 2007-9-26 17:40:14
在linux 下测试成功,   配置很简单。
只要你的服务器支持PHP,就可以了,把上面的PHP脚本拷贝到指定目录,修改两处地方:
(1)  $passwdfile="E:"svn"config"htpasswd.conf";
    你自己的密码目录: 例如:/home/svn/passwd

(2)  $command='"D:"Program Files"Apache Group"Apache2"bin"htpasswd.exe" -       b '.$passwdfile." ".$username." ".$newpass;
    htpasswd 的路径:例如:/usr/bin/htpasswd

OK。页面同windows下的ApachePasswd一样,,详细我文档尽快整理出来。

[ 本帖最后由 99lingbo 于 2007-11-15 10:43 编辑 ]
Admin at 2007-9-26 17:46:54
很好,多谢分享
huixiang at 2007-10-16 10:24:32
期待linux下的完全编码及其实现形式详解啊
caowei99 at 2007-10-16 18:06:40
谢谢分享,明天回来测试……
shiyufang at 2007-11-12 13:45:11
好厉害呀,我一定要在两个环境中都实现一下
piggyxxi at 2007-11-22 14:42:57
真不错这正是我需要的东西,找了很久了。
huangling at 2007-11-27 15:54:26
能贴出linux版的么
99lingbo at 2007-11-28 08:48:49
$passwdfile="E:"svn"config"htpasswd.conf";
$command='"D:"Program Files"Apache Group"Apache2"bin"htpasswd.exe" -b '.$passwdfile." ".$username." ".$newpass;

linux版本只需要修改上面两句:
我的修改:
$passwdfile="/home/svn/passwd";
$command='"/usr/bin/htpasswd" -b '.$passwdfile." ".$username." ".$newpass;
huangling at 2007-11-28 09:43:37
Alias /svntools "E:/svn/svntools/"
<Directory "E:/svn/">
Require valid-user

# how to authenticate a user
AuthType Basic
AuthName "Subversion Tools"
AuthUserFile e:/svn/config/htpasswd.conf
</Directory>

这个不需要修改么?这几句话是放在哪里的呢?是不是apache2/conf/httpd.conf下面的呢?里面的svntool是不是应该和下面的svnmodfy一个名字呢?是笔误还是就是应该这样些呢?

不好意思,我不太懂php,我看你前面起了一个别名svnmodify,但是后面只搜到modify,这两个是一回事么。你的index.php是放在路径、home/svn下面么?
99lingbo at 2007-11-28 10:30:45
在httpd.conf下加上:

Alias /passwd  "/home/svn/passwd.php"
<Directory "/home/svn/svntools/">
AuthName "Subversion PasswdChanged"
AuthType Basic
AuthUserFile /home/svn/passwd
Require valid-user
</Directory>

其中Alias /passwd  "/home/svn/passwd.php"是自定义的。到时就可以输入http://localhost/passwd 就可以了
"/home/svn/passwd.php"是你的PHP脚本位置
/home/svn/passwd是要修改的密码
huangling at 2007-11-29 10:42:27
报[client 192.168.0.124] client denied by server configuration: /home/svnroot/conf/passwd.php,确认passwd.php用户是apache的用户svnroot:svnroot,权限 已经开到777
huangling at 2007-11-29 10:55:53
我的apache,svn等都是源代码安装的,安装目录是/usr/local,我的php是apt-get安装的。所以LoadModule php5_module  module/libphp5.so改成了LoadModule php5_module  /usr/lib/apache2/modules/libphp5.so,这样是不是不行呢?
huangling at 2007-11-29 11:01:56
[Thu Nov 29 11:03:02 2007] [notice] Apache/2.2.6 (Unix) DAV/2 SVN/1.4.5 PHP/5.2.0-8+etch5~pu1 configured -- resuming normal operations
[Thu Nov 29 11:03:18 2007] [error] [client 192.168.0.124] client denied by server configuration: /home/svnroot/conf/passwd.php
99lingbo at 2007-11-29 13:20:02
http://rapidshare.com/files/7302 ... 1___26426_.doc.html
点击最下放free按扭  下载祥解
huangling at 2007-11-29 14:16:59
我已经收到邮件了,就是按照你的邮件配的!呵呵!我再手动安装php试试吧
huangling at 2007-11-29 14:59:20
我一直找不到原因,就把passwd.php放到apache/htdocs下面了,然后输入http://192.168.0.62/passwd.php,显示是乱码。是不是我的编码选择不对?我的现在选的是 西方(ISO-8859-1),应该选什么呢?
huangling at 2007-11-29 16:06:51
用户名不是自己填而是自动生成的么?
99lingbo at 2007-11-30 11:15:32
是要自己填写的,就好象利用IE 登陆SVN一样,填写用户名与密码后,出现密码修改界面,用户才默认了
99lingbo at 2007-11-30 11:20:57
编码出现了问题
用UTF-8 GB1312
还有http://192.168.0.62/passwd.php要输入正确
如果httpd.conf配置
Alias /passwd  "/home/passwdtool/passwd.php/"
<Directory "E:/svn/">
Require valid-user
AuthType Basic
AuthName "Subversion Tools"
AuthUserFile /home/passwd
</Directory>
URL应该是http://localhost/passwd才对

posted on 2008-01-02 11:15 百科 阅读(627) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(2)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜