<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 40, comments - 58, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Apache James 用戶信息的數據庫存儲和密碼問題

    Posted on 2008-06-26 11:55 Astro.Qi 閱讀(1874) 評論(0)  編輯  收藏 所屬分類: Java
    一、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郵件用戶的用戶信息默認保存在apps\james\var\users目錄下,通過修改配置文件apps\james\SAR-INF\config.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根據james_home\apps\james\conf的內容創建的。

    通過以上配置,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-src\dist\james-2.1\apps下面找到新生成的james.sar文件。把該文 件覆蓋James原來james.sar,并刪除與james.sar同級的james目錄,重啟動james即可。建議保留原來的 config.xml,免得又配一次。

    通過以上探討,我們明白了如何通過Web方式進行用戶注冊和用戶登記等。需要說明一點是,James自動生成的users表中只有7個字段,而且都 是系統需要使用的。一般注冊時需要輸入的信息項比較多,這時建議開發者自己再建一個新表USERINFO,用username把兩個表關聯起來,不建議修 改users表的內容(如果想試試,請參考james_home\apps\james\conf)。

    五、基于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

    主站蜘蛛池模板: 91老湿机福利免费体验| 99在线视频免费观看| 16女性下面扒开无遮挡免费| 亚洲精品色婷婷在线影院| 亚洲a无码综合a国产av中文| 日韩在线a视频免费播放| 亚洲AV成人无码久久WWW| 成人黄动漫画免费网站视频 | 四虎国产精品永久免费网址| 国产精品久久久亚洲| 中文字幕免费在线观看动作大片| 亚洲国产另类久久久精品黑人 | 亚洲&#228;v永久无码精品天堂久久 | 亚洲一区二区三区写真| 麻豆国产精品入口免费观看| 国产精品亚洲二区在线| 亚洲五月午夜免费在线视频| 中文字幕版免费电影网站| 亚洲人成亚洲精品| 无人在线直播免费观看| 久久精品国产亚洲av品善| 亚洲男人av香蕉爽爽爽爽| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚洲美女视频免费| 好吊妞视频免费视频| 国产精品亚洲va在线观看| 亚洲中文字幕无码久久精品1| 精品国产污污免费网站 | 亚洲视频在线一区二区| 免费成人高清在线视频| 亚洲成无码人在线观看| 国产大片线上免费看| 日本免费久久久久久久网站| 久久精品亚洲AV久久久无码| 亚洲成a人片在线观看老师| 免费成人高清在线视频| 亚洲精品9999久久久久无码| 国产成人麻豆亚洲综合无码精品 | 在线免费一区二区| 国产又黄又爽又大的免费视频| 亚洲视频在线观看地址|