- 浏览: 485905 次
- 性别:
- 来自: 武汉
最新评论
-
zyzyzy123:
请问有工程吗,我现在正在实现打电话的功能,但是一直不通,怀疑是 ...
实用的java 串口通信程序 -
wuhaitong:
引用[img][/img][*][url][/url] ...
jbpm -
迷糊_le:
maven命令, 蛮好的,谢谢
maven eclipse -
Wuaner:
不错的文章 , 谢谢分享!
Hadoop -
yuqihengsheng:
strong 很细
HighLighter
Apache James用户信息的数据库存储和密码问题
本文主要解决两个问题:一个是如何将James的用户信息存储到数据库中,二是在进行James二次开发时,如何处理密码问题。本文面向对James有一定使用经验的用户,对于James的初学者,请先阅读我的另一篇文章《Apache James使用入门》。
一、James简介
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、一个假设的项目
假设我要以James为邮件服务器,开发一套基于Web的邮件系统,就像263.net,163.net一样,要求实现在线注册、在线收发邮件等功能。
默认情况下,James的用户信息存储在文本中,虽然加了密,但由于文本存档不足,不便于查询及相应处理,幸好James提供了多种用户信息存储方案,如数据库存储,LDAP存储等。
这里我们将以数据库存储为例,讲解用户信息的管理,数据库采用MySQL。当然你也可以采用LDAP,比如免费的OpenLDAP,功能非常强大。
三、用户信息的数据库存储
James邮件用户的用户信息默认保存在appsjamesvarusers目录下,通过修改配置文件appsjamesSAR-INFconfig.xml,可以把用户信息保存到数据库中,配置方法如下:
第一步:在MySQL中新建一个数据库mail,用户名root,密码为空;
第二步:打开config.xml,找到<users-store>这一项,此面默认的内容为:
需要修改为:
通过修改,我们就把用户信息的存储介质从file改成了db,<sqlFile>是指明了在db中的数据表结构及相关数据库信息。
第三步:仍然是config.xml,找到<data-sources>项,默认内容为空,把此项内容修改为:
<driver>是指MySQL的JDBC驱动,<dburl>指数据库的访问路径,IP后的mail即MySQL中新建数据库名,接下来是用户名、密码及最大连接数。
至此,数据库配置完成,启动James,若正常无误,请通过telnet添加一个新用户,比如adduser holen 123456,然后检查MySQL中的mail数据库,下面将有一个表users,这是James根据file://conf/sqlResources.xml的内容创建的。
通过以上配置,James的用户信息就可以保存在数据库中了。
四、密码问题
当你通过telnet添加新用户时,比如adduser holen 123456,你可以查看数据库中的记录,第一个字段是holen,第二字段是密码,但密码并非123456,而一串“乱码”(zhwQUMTwdMqWfm/h0biB51Gf)??这是加密码后的密码内容,再看后面的字段是“SHA”,显然用的是SHA加密方式。
通过telnet方式添加新用户,用户密码将自动加密,然后插入数据库中。但通过telnet方式进行用户管理有着诸多不便,尽管你可以借助James的一个RMI工具包,提高效率,但仍然没有本质改变,当需要用作商业用途时,你更不能要求你的客户熟记那一堆命令符。
一般我们可以做一个Web前端,通过网页形式,添加修改用户,界面友好,傻瓜化使用,如263或163一样。若这样做,我们就需要直接操作数据库,添加用户记录或修改删除用户记录了。但别忘了,James默认对用户密码是加密的,既然我们要直接操作数据库,那么我们只有两个选择:要么我们研究其密码机制,添加记录时,我们对新增用户的密码进行同样加密,要么我们去掉James的加密机制,使其明码保存。
幸好,这两种选择都是可行的。我们从Apache网站下载James的源码包,下载后的文件为james-2.1-src.zip,接近8M,通过分析源码,我们发现,与用户密码相关的文件是DefaultUser.java,部分源码如下:
第一个方法verifyPassword()是用来做密码认证,传入的参数是明文密码,通过DigestUtil.digestString()方法,转换成密文密码,然后与数据库中密码作比较,返回比较结果。请注意这里的DigestUtil.digestString()方法,在后面还在提到。
第二个方法setPassword()是用于密码转换的,把明文转成密文,用的同样是DigestUtil.digestString()方法。
谈到这里,相信你应该知道怎么在自己的程序中进行密码转换和密码认证了吧!其实并不是要你自己去写一个SHA的加密算法,既然James已经提供了此功能,你调用便是了。
还有一种情况,开发者需要在数据库中必须用明文保存密码,这样就不必在自己写的程序中进行密码转换了,而且当多个应用系统采用统一用户模型时,最好只有一个用户实例。要实现这个需求,就只能修改James源代码了,把verifyPassword()方法和setPassword()改成:
其实就是把转换过程去掉,保存和认证就都采用明文进行了。
你要是觉得SHA方式不妥,也可以挂接别的加密方式,同样是修改这两个方法。
注意,当你修改了James的源码后,你需要用Ant重新build James项目,build后将在james-2.1-srcdistjames-2.1apps下面找到新生成的james.sar文件。把该文件覆盖James原来james.sar,并删除与james.sar同级的james目录,重启动james即可。建议保留原来的config.xml,免得又配一次。
通过以上探讨,我们明白了如何通过Web方式进行用户注册和用户登记等。需要说明一点是,James自动生成的users表中只有7个字段,而且都是系统需要使用的。一般注册时需要输入的信息项比较多,这时建议开发者自己再建一个新表USERINFO,用username把两个表关联起来,不建议修改users表的内容(如果想试试,请参考file://conf/sqlResources.xml)。
五、基于James的邮件系统开发方案简述
James运行在Win2000上,客户端采用Web界面(仿263风格)、Foxmail或OutLook Express,该系统主要面向1000人以下的中小企业。
基于James的邮件开发,主要包括两个方面:一是邮件系统的后台管理,另一个是客户端应用系统。
后台管理的功能主要包括用户的添加、删除、修改、用户使用空间指配、邮件备份等。
Web客户端功能包括收件箱、发邮件、发件箱、草稿箱、回收站、地址本、自定义文件夹、配置等。
用户信息存储在MySQL数据库中,邮件内容默认存储在文档中。
系统采用Struts架构,运行环境为Apache1.3+Tomcat4.1,数据库连接池采用Tomcat自带的DBCP。
系统开发预计需60人天完成,开发人员需要掌握Struts和JavaMail。
压力测试超过50个并发。
六、参考资料
James 2.1 Documentation
一、James简介
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、一个假设的项目
假设我要以James为邮件服务器,开发一套基于Web的邮件系统,就像263.net,163.net一样,要求实现在线注册、在线收发邮件等功能。
默认情况下,James的用户信息存储在文本中,虽然加了密,但由于文本存档不足,不便于查询及相应处理,幸好James提供了多种用户信息存储方案,如数据库存储,LDAP存储等。
这里我们将以数据库存储为例,讲解用户信息的管理,数据库采用MySQL。当然你也可以采用LDAP,比如免费的OpenLDAP,功能非常强大。
三、用户信息的数据库存储
James邮件用户的用户信息默认保存在appsjamesvarusers目录下,通过修改配置文件appsjamesSAR-INFconfig.xml,可以把用户信息保存到数据库中,配置方法如下:
第一步:在MySQL中新建一个数据库mail,用户名root,密码为空;
第二步:打开config.xml,找到<users-store>这一项,此面默认的内容为:
<repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository"> <destination URL="file://var/users/"/> </repository> |
需要修改为:
<repository name="LocalUsers" class="org.apache.james.userrepository.JamesUsersJdbcRepository" destinationURL="db://maildb/users"> <sqlFile>file://conf/sqlResources.xml</sqlFile> </repository> |
通过修改,我们就把用户信息的存储介质从file改成了db,<sqlFile>是指明了在db中的数据表结构及相关数据库信息。
第三步:仍然是config.xml,找到<data-sources>项,默认内容为空,把此项内容修改为:
<data-source name="maildb" class="org.apache.james.util.mordred.JdbcDataSource"> <driver>org.gjt.mm.mysql.Driver</driver> <dburl>jdbc:mysql://127.0.0.1/mail</dburl> <user>root</user> <password></password> <max>20</max> </data-source> |
<driver>是指MySQL的JDBC驱动,<dburl>指数据库的访问路径,IP后的mail即MySQL中新建数据库名,接下来是用户名、密码及最大连接数。
至此,数据库配置完成,启动James,若正常无误,请通过telnet添加一个新用户,比如adduser holen 123456,然后检查MySQL中的mail数据库,下面将有一个表users,这是James根据file://conf/sqlResources.xml的内容创建的。
通过以上配置,James的用户信息就可以保存在数据库中了。
四、密码问题
当你通过telnet添加新用户时,比如adduser holen 123456,你可以查看数据库中的记录,第一个字段是holen,第二字段是密码,但密码并非123456,而一串“乱码”(zhwQUMTwdMqWfm/h0biB51Gf)??这是加密码后的密码内容,再看后面的字段是“SHA”,显然用的是SHA加密方式。
通过telnet方式添加新用户,用户密码将自动加密,然后插入数据库中。但通过telnet方式进行用户管理有着诸多不便,尽管你可以借助James的一个RMI工具包,提高效率,但仍然没有本质改变,当需要用作商业用途时,你更不能要求你的客户熟记那一堆命令符。
一般我们可以做一个Web前端,通过网页形式,添加修改用户,界面友好,傻瓜化使用,如263或163一样。若这样做,我们就需要直接操作数据库,添加用户记录或修改删除用户记录了。但别忘了,James默认对用户密码是加密的,既然我们要直接操作数据库,那么我们只有两个选择:要么我们研究其密码机制,添加记录时,我们对新增用户的密码进行同样加密,要么我们去掉James的加密机制,使其明码保存。
幸好,这两种选择都是可行的。我们从Apache网站下载James的源码包,下载后的文件为james-2.1-src.zip,接近8M,通过分析源码,我们发现,与用户密码相关的文件是DefaultUser.java,部分源码如下:
package org.apache.james.userrepository; …… /** * Method to verify passwords. * * @param pass the String that is claimed to be the password for this user * @return true if the hash of pass with the current algorithm matches * the stored hash. */ public boolean verifyPassword(String pass) { try { String hashGuess = DigestUtil.digestString(pass, algorithm); return hashedPassword.equals(hashGuess); } catch (NoSuchAlgorithmException nsae) { throw new RuntimeException("Security error: " + nsae); } } /** * Sets new password from String. No checks made on guessability of * password. * * @param newPass the String that is the new password. * @return true if newPass successfuly hashed */ public boolean setPassword(String newPass) { try { hashedPassword = DigestUtil.digestString(newPass, algorithm); return true; } catch (NoSuchAlgorithmException nsae) { throw new RuntimeException("Security error: " + nsae); } } …… |
第一个方法verifyPassword()是用来做密码认证,传入的参数是明文密码,通过DigestUtil.digestString()方法,转换成密文密码,然后与数据库中密码作比较,返回比较结果。请注意这里的DigestUtil.digestString()方法,在后面还在提到。
第二个方法setPassword()是用于密码转换的,把明文转成密文,用的同样是DigestUtil.digestString()方法。
谈到这里,相信你应该知道怎么在自己的程序中进行密码转换和密码认证了吧!其实并不是要你自己去写一个SHA的加密算法,既然James已经提供了此功能,你调用便是了。
还有一种情况,开发者需要在数据库中必须用明文保存密码,这样就不必在自己写的程序中进行密码转换了,而且当多个应用系统采用统一用户模型时,最好只有一个用户实例。要实现这个需求,就只能修改James源代码了,把verifyPassword()方法和setPassword()改成:
public boolean verifyPassword(String pass) { return hashedPassword.equals(pass); } public boolean setPassword(String newPass) { hashedPassword = newPass; return true; } |
其实就是把转换过程去掉,保存和认证就都采用明文进行了。
你要是觉得SHA方式不妥,也可以挂接别的加密方式,同样是修改这两个方法。
注意,当你修改了James的源码后,你需要用Ant重新build James项目,build后将在james-2.1-srcdistjames-2.1apps下面找到新生成的james.sar文件。把该文件覆盖James原来james.sar,并删除与james.sar同级的james目录,重启动james即可。建议保留原来的config.xml,免得又配一次。
通过以上探讨,我们明白了如何通过Web方式进行用户注册和用户登记等。需要说明一点是,James自动生成的users表中只有7个字段,而且都是系统需要使用的。一般注册时需要输入的信息项比较多,这时建议开发者自己再建一个新表USERINFO,用username把两个表关联起来,不建议修改users表的内容(如果想试试,请参考file://conf/sqlResources.xml)。
五、基于James的邮件系统开发方案简述
James运行在Win2000上,客户端采用Web界面(仿263风格)、Foxmail或OutLook Express,该系统主要面向1000人以下的中小企业。
基于James的邮件开发,主要包括两个方面:一是邮件系统的后台管理,另一个是客户端应用系统。
后台管理的功能主要包括用户的添加、删除、修改、用户使用空间指配、邮件备份等。
Web客户端功能包括收件箱、发邮件、发件箱、草稿箱、回收站、地址本、自定义文件夹、配置等。
用户信息存储在MySQL数据库中,邮件内容默认存储在文档中。
系统采用Struts架构,运行环境为Apache1.3+Tomcat4.1,数据库连接池采用Tomcat自带的DBCP。
系统开发预计需60人天完成,开发人员需要掌握Struts和JavaMail。
压力测试超过50个并发。
六、参考资料
James 2.1 Documentation
发表评论
-
安装和使用memcached
2014-04-16 16:24 644如何将 memcached 融入到 ... -
applicationContext.xml
2013-08-09 09:05 948<?xml version="1.0&quo ... -
注释驱动的 Spring cache 缓存介绍
2013-08-08 07:04 665概述 Spring 3.1 引入了激动人心的基于注释(an ... -
Spring2.5 Annotations
2013-08-08 06:33 862完成setXxxx功能,即配置文件的 <propert ... -
Spring基于注解的缓存配置--EHCache AND OSCache
2013-08-07 23:21 1032本文将构建一个普通工程来说明spring注解缓存的使用方式, ... -
Ehcache 整合Spring 使用页面、对象缓存
2013-08-07 22:51 899Ehcache 整合Spring 使用页面、对象缓存 ... -
javassist教程和示例
2013-05-18 08:57 2014Javassist是一个执行字节 ... -
ZooKeeper官方文档
2013-05-16 17:09 1563介绍(源自ZooKeeper官方文档) 学习HBase过程 ... -
ZooKeeper -例子
2013-05-16 17:08 1217ZooKeeper ZooKeepe ... -
Spring整合Hessian访问远程服务
2013-05-15 13:44 860Spring整合Hessian访问远程服务 目录 1.1 ... -
redis
2013-05-14 11:44 773redis是一个key-value存储系统。和Memcach ... -
spring 资源访问
2013-05-13 08:26 1004spring在java基础上封装了资源访问,简单易用。 R ... -
ZooKeeper——入门
2013-05-08 16:12 913ZooKeeper——入门 博客分类: ZooK ... -
分布式服务框架 Zookeeper -- 管理分布式环境中的数据(IBM)
2013-05-08 14:07 788安装和配置详解 本文 ... -
分布式协调服务---Zookeeper
2013-05-08 14:05 7791、Zookeeper overview Zookee ... -
Hibernate
2013-03-28 13:04 927一、简述 Hibernate 和 JD ... -
Apache+Tomcat集群配置详解
2013-02-01 10:52 898Apache + Tomcat集群配置详解(1) 一、 ... -
Apache+Jboss集群基于反向代理的负载均衡
2013-02-01 10:40 2498假设三台机器IP分别为172.29.128.100、172. ... -
spring + ibatis 多数据源事务(分布式事务)管理配置方法
2012-12-17 15:18 1270spring + ibatis 多数据源事务(分布式事务 ... -
Hessian序列化不设SerializerFactory性能问题
2012-10-31 09:47 1504Hessian序列化不设SerializerFactor ...
相关推荐
### Apache James 使用入门详解 #### 一、Apache James 概述 Apache James 是一款由 Apache 组织开发的开源邮件服务器软件,它完全基于 Java 技术构建,支持多种邮件协议,包括 SMTP(Simple Mail Transfer ...
Apache James邮件服务器是一款开源的、基于Java的全功能邮件服务器,它支持SMTP、POP3和IMAP协议,为企业和个人提供了一种可靠且可扩展的邮件处理解决方案。在本项目中,我们将探讨如何利用Apache James来实现邮件的...
Apache James Server是一个开源的邮件服务器解决方案,它提供了邮件传输代理(MTA)、用户代理(MUA)以及相关的邮件服务功能。在了解Apache James Server 3的配置之前,我们需要首先了解它的一些核心概念和组件。 ...
### Apache James 3.0 实战安装指南 #### 一、Apache James简介 Apache James (Java Apache Mail Enterprise Server) 是一款由Apache基金会维护的开源邮件服务器解决方案,它完全基于Java语言编写,支持多种邮件...
"Apache James专题" Apache James是一款基于Java的开源邮件服务器软件,提供了丰富的邮件处理功能和配置选项。本文将对Apache James的安装、配置和应用进行详细介绍。 Apache James的安装 在安装Apache James之前...
Apache James 是一款开源的邮件服务器软件,主要用于处理电子邮件的接收、发送、存储等任务。本文将详细介绍如何在Linux CentOS 5.1环境下安装配置Apache James邮件服务器。 首先,我们需要准备以下环境: 1. 操作...
Apache James邮件服务器用户信息的数据库存储问题.doc
在IT领域,构建自己的邮件系统是一项复杂而有挑战性的任务,但通过Apache James Mailserver和Claros inTouch Webmail的组合,我们可以实现一个自托管、功能完善的电子邮件解决方案。以下是对这个搭建过程的详细解析...
标题中的"mailServer Apache James / sendmail / qmail"提到了三个不同的邮件服务器软件,它们在IT领域中扮演着重要角色。Apache James是基于Java的开源邮件服务器,sendmail和qmail则是历史悠久的Unix/Linux环境下...
4. 增加修改账号密码的功能,配合Apache James邮件服务器使用,密码加密采用SHA 5. 修复Notes中的一个缺陷,由于MySQL不支持Timestamp空值导致出错的问题 安装说明: 1. Intouch2和James共享同一个数据库 2. 数据库...
apache james(邮件服务器)配置.经过配置可以向163、qq等邮箱发送邮件
Apache James是开源的邮件服务器项目,它基于Java技术构建,提供了全面的邮件服务功能,包括邮件接收、发送、存储以及管理。"apache-james-2.3.2.jar"是该项目的一个版本,此版本为2.3.2,通常包含了运行Apache ...
Apache James是一款开源的企业级邮件服务器,它提供了丰富的功能,包括邮件传输、存储、过滤和管理。在Apache James 3.0版本中,它加强了对 Lightweight Directory Access Protocol (LDAP) 的支持,使得用户能够利用...
Apache James邮件服务器是一款开源的邮件服务器软件,基于Java平台,实现了SMTP、POP3和IMAP4等邮件协议,为企业和个人提供了稳定、可扩展的邮件服务解决方案。本篇将深入探讨如何配置Apache James邮件服务器。 ...
This is an AUTOMATED NIGHTLY TEST BUILD for Apache JAMES. Such nightly builds are automatically generated from the current source repository for testing. Assuming that they even compile, these ...
刚进个小公司就让我搭建个服务器,研究了一个星期,总算是搞定了,网上找了很多资料,看了很久也研究了很久,最后总结了下...搭建成功...收发邮件都没问题...不过如果是收邮件的话必须要有注册的域名,也就是公网的域名才...
自己爬取的apache james 邮件服务器的英文documention,作为本地使用,结构清晰 James components About James Server Mailets Quick Start Mailet API Basic Mailet Toolkit Standard Mailets Crypto Mailets ...
### Apache James 邮件服务器搭建与应用 #### 一、Apache James 简介 Apache James 是一款完全由 Java 编写的邮件服务器,能够提供完整的邮件收发服务。它支持标准的邮件协议,包括 SMTP(简单邮件传输协议)、...