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服务器整合实现负载均衡。
- 部署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
- 修改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至此可以使用统一的用户名和密码。
- Subversion和xplanner使用统一用户名和密码
- Jenkins -- Subversion 的用户名和密码
- AD自动使用当前用户名和密码
- jsp使用Cookie记录用户名和密码
- 使用Cookie记录用户名和密码
- 使用Cookie记录用户名和密码
- 使用NSUserDefaults保存用户名和密码
- 使用NSUserDefaults保存用户名和密码2
- 使用keychain来存取用户名和密码
- 使用NSUserDefaults保存用户名和密码
- 使用keychain来存取用户名和密码
- 使用NSUserDefaults保存用户名和密码
- 使用SharedPreference实现记住用户名和密码
- 使用NSUserDefaults保存用户名和密码
- 使用NSUserDefaults保存用户名和密码
- 使用NSUserDefaults保存用户名和密码
- iOS使用NSUserDefaults保存用户名和密码
- 使用SharedPreferences保存用户名和密码
- Bugzilla安装配置(windows平台,CGI访问)
- const type *var, type const * var, type *const var 和 const type *const var
- prim algorithm
- Insus.NET:七道最经典的asp.net页面传值题
- PRO/E中打开Autocad实体图
- Subversion和xplanner使用统一用户名和密码
- Proe和ug的转换方法
- min_heapsort.h
- 小談IEnumerable和IEnumerator接口
- AutoCAD图导入photoshop的方法
- CAD快捷命令
- 数控刀具国家标准
- C语言实现堆栈(栈)的数据结构
- C# 基础概念【一】