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 百科 閱讀(642) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西丰县| 宁陕县| 慈溪市| 琼结县| 济宁市| 慈利县| 荣成市| 静海县| 海南省| 左权县| 澄迈县| 水富县| 长宁县| 盘山县| 梅河口市| 齐河县| 班玛县| 勃利县| 金溪县| 会理县| 渭南市| 阜平县| 台中县| 尼玛县| 平果县| 静海县| 宜宾县| 永城市| 江都市| 城市| 莫力| 隆回县| 舞钢市| 东乡| 孟州市| 台南县| 阳山县| 沙湾县| 锦州市| 六盘水市| 克什克腾旗|