Subversion和xplanner使用统一用户名和密码

来源:互联网 发布:js获取cookie 编辑:程序博客网 时间:2024/06/06 02:16

作者原创,转载请指明出处,谢谢!

Subversion部署

系统环境:

Windows 2003 server

软件环境:

Apache_2.0.61-win32-x86

tortoisewin32svn

Subversion1.4.5

安装软件:

1.      安装apache服务器:下载:http://httpd.apache.org/download.cgi

2.      安装subversion:下载subversion并进行安装。

3.      安装tortoise.

配置apache服务器:编辑apache的配置文件httpd.conf,在我的实验环境中的路径为:C:/Program Files/Apache Group/Apache2/conf,具体路径视安装路径的不同而不同:在配置文件的尾部添加如下内容:

<Location /svn>

DAV svn

SVNParentPath "c:/svn"

 

AuthType Basic

AuthName "Subversion repository"

 

Require valid-user

 

AuthMySQLHost localhost

AuthMySQLUser root

 

AuthMySQLPassword root

AuthMySQLDB xplanner  //这一个用来设定认证需要的数据库名字

 

AuthMySQLUserTable person //认证信息存放的数据表的名字

 

AuthMySQLNameField userId //用户名字段

 

AuthMySQLPasswordField password //密码字段

 

AuthMySQLPwEncryption md5 // 密码应用MD5加密,后面将xplanner的加密算法改为MD5加密,两个应用可以使用相同的用户名和密码进行登录:

</Location>

下载mod_auth_mysql.so并将该文件加入到apache的modules目录下,同时将subversion安装路径下bin目录中mod_authz_svn.so和mod_dav_svn.so拷贝到apache的modules目录下。

建立版本库:c:/svn/test

 Xplanner的部署

软件环境:

Tomcat5.523

Tomecat5.525

Xplanner-0.7b7b

两个tomcat和apache服务器整合实现负载均衡。

  1. 部署xplanner。

 

Create a database for xplanner:

CREATE DATABASE xplanner CHARACTER SET UTF8 COLLATE utf8_general_ci;

grant all on xplanner.* to 'xplanner'@'localhost' identified by 'xp'

修改xplanner.properties

hibernate.connection.dbname=xplanner

hibernate.connection.url=jdbc:mysql://localhost/xplanner

hibernate.connection.username=xplanner

hibernate.connection.password=xp

 

 

运行  :ant create.db.schema.script

 

  1. 修改xplanner验证和密码加密模块

 

因为xplanner默认使用的密码加密方式为MD5加密算法和BASE64编码的结合,所以在xplanner里创建的账户密码的加密方式和subversion中密码的加密方式不同,导致帐户不能通用,所以在部署xplanner以前先要把subversion的源代码进行修改,在eclipse下将xplanner部署成web项目,修改其中和登录验证和密码加密的模块,在部署xplanner的时候要注意,因为xplanner并不是eclipse项目,所以其目录结构和eclipse项目有很大的区别,具体是现在eclipse中新建一个项目xplanner,为该项目添加struts和spring支持,将xplanner/WEB-INF/classes下的文件夹拷入xplanner项目的scr目录下,然后将xplanner/WEB-INF/classes下的其他文件拷入webcontent/WEB-INF目录下,然后将xplanner/WEB-INF/lib目录下的jar包考入webcontent/WEB-INF/lib目录下。因为要修改的模块不涉及jsp页面部分,所以对其他的jsp部分不做处理,所有完成以后刷新项目xplanner,将包com.technoetic.xplanner.security.module下的具体是xplanner下的XPlannerLoginModule 源文件修改如下:

package com.technoetic.xplanner.security.module;

 

import java.security.MessageDigest;

import java.security.SecureRandom;

import java.util.Arrays;

import java.util.Map;

import javax.security.auth.Subject;

import javax.servlet.http.HttpServletRequest;

 

import net.sf.hibernate.Session;

import org.apache.log4j.Logger;

 

import com.technoetic.xplanner.db.hibernate.ThreadSession;

import com.technoetic.xplanner.domain.Person;

import com.technoetic.xplanner.security.AuthenticationException;

import com.technoetic.xplanner.security.LoginModule;

 

 

public class XPlannerLoginModule implements LoginModule {

   private transient Logger log = Logger.getLogger(getClass());

   private final transient SecureRandom secureRandom = new SecureRandom();

   private String name;

   private LoginSupport loginSupport;

  

 

   public XPlannerLoginModule(LoginSupport support) {

       loginSupport = support;

   }

 

   public void setOptions(Map options) {}

 

    public Subject authenticate(String userId, String password) throws AuthenticationException {

       log.debug(ATTEMPTING_TO_AUTHENTICATE + this.getName() +" (" + userId + ")");

       Subject subject = loginSupport.createSubject();

       Person person = loginSupport.populateSubjectPrincipalFromDatabase(subject, userId);

       if (!isPasswordMatched(person, password))

       {

          throw new AuthenticationException(MESSAGE_AUTHENTICATION_FAILED_KEY);

       }

       log.debug(AUTHENTICATION_SUCCESFULL + this.getName());

       return subject;

    }

 

    public boolean isCapableOfChangingPasswords() {

        return true;

    }

 

    boolean isPasswordMatched(Person person, String password) throws AuthenticationException {

        log.debug("evaluating password match for " + person.getUserId());

        String storedPassword = person.getPassword();

        if (storedPassword == null) {

            throw new AuthenticationException(MESSAGE_NULL_PASSWORD_KEY);

        }

      

 

      

    

       String digestForGivenPassword = MD5(password);

     storedPasswordBytesWithSalt.length - 12);

      

        boolean isMatching = digestForGivenPassword.equals(storedPassword);

        log.debug("passwords " + (isMatching ? "matched" : "did not match") + " for " + person.getUserId());

        return isMatching;

    }

 

    public final static String MD5(String s) {

        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',

          'a', 'b', 'c', 'd', 'e', 'f' };

        try {

         byte[] strTemp = s.getBytes();

         MessageDigest mdTemp = MessageDigest.getInstance("MD5");

         mdTemp.update(strTemp);

         byte[] md = mdTemp.digest();

         int j = md.length;

         char str[] = new char[j * 2];

         int k = 0;

         for (int i = 0; i < j; i++) {

          byte byte0 = md[i];

          str[k++] = hexDigits[byte0 >>> 4 & 0xf];

          str[k++] = hexDigits[byte0 & 0xf];

         }

         return new String(str);

        } catch (Exception e) {

         return null;

        }

       }

 

   public void changePassword(String userId, String password) throws AuthenticationException {

       log.debug("changing password for " + userId);

       try {

           Session session = ThreadSession.get();

           try {

              Person person = loginSupport.getPerson(userId);

               if (person != null) {

                   person.setPassword(encodePassword(password));

                   session.flush();

                   session.connection().commit();

               } else {

                   throw new AuthenticationException("couldn't find person.");

               }

           } catch (Throwable ex) {

               session.connection().rollback();

               log.error("error during password change.", ex);

               throw new AuthenticationException("server error.");

           }

 

       } catch (Exception e) {

           log.error("error", e);

           throw new AuthenticationException("server error.");

       }

   }

 

    public void logout(HttpServletRequest request) throws AuthenticationException {

        request.getSession().invalidate();

    }

 

    public String getName()

    {

        return name;

    }

 

    public void setName(String name)

    {

       this.name = name;

    }

 

   public String encodePassword(String password) throws Exception {

   

 

      String digest = MD5(password);

   

 

 

       return digest;

       }

 

  

   public static void main(String[] args) {

       try {

           String password;

           if (args.length == 0) {

               password = "admin";

           } else {

               password = args[0];

           }

           System.out.println(new XPlannerLoginModule(new LoginSupportImpl()).encodePassword(password));

       } catch (Exception e) {

           e.printStackTrace();

       }

   }

  

}

主要是要用自己的算法替换掉原来的账户认证和加密算法。使之和subversion的加密算法保持一致。

用新的XPlannerLoginModule.class将原来xplanner对应目录下的XPlannerLoginModule.class文件替换掉。

将xplanner放到tomcat的webapption目录下。然后在apache的conf目录下的httpd.conf文件进行编辑:

<VirtualHost localhost>

 

DocumentRoot "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/ROOT"

ServerName localhost

DirectoryIndex index.html index.htm index.asp index.jsp

Alias /jsp-examples "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/jsp-examples"

Alias /servlets-examples "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/servlets-examples"

Alias /tomcat-docs "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/tomcat-docs"

Alias /webdav "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/webdav"

Alias /xplanner "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/xplanner"

Alias /continumm "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/continumm"

 

JkMount /servlet/* controller  

JkMount /*.jsp controller

JkMount /xplanner/* controller

JkMount /continumm/* controller

   

</VirtualHost>

然后重新启动apache服务器。启动tomcat。这时将会在xplanner数据库中创建一系列的数据表,其中person表示用来存放用户信息的,在第一次启动时创建了sysadmin用户,密码是admin,但是这个密码无法登陆xplanner,因为在创建sysadmin时使用的还是xplanner的密码加密方式,而此时的xplanner验证页面使用的加密方式已经改成了MD5,为了让超级用户可以登录到xplanner要将其密码改成MD5加密的方式存放,用root用户进入mysql的xplanner数据库中,执行如下sql语句:

update person set password=MD5('wipro@123') where userId='sysadmin';

此时将sysadmin用户的密码改成wipro@123,用MD5算法加密后存放在数据表中。

此时登录http://localhost/xplanner,然后使用sysadmin用户和密码wipro@123就可以登入系统。

然后登陆http://localhost/svn/test,同样使用sysadmin用户和密码wipro@123登入系统。

Subversion和xplanner至此可以使用统一的用户名和密码。