即時聊天IM之二 openfire 整合現有系統用戶

合肥程序員羣:49313181。    合肥實名程序員羣:128131462 (不肯透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

 綜述:java

天天利用中午時間更新下這個知識點的的博客若是感興趣的以爲更新慢了也別介意(其它時間仍是以工做爲主,學習工做兩不誤,哈哈……)。上一篇我純理論上簡單講解了一下XMPP協議,然而如今用的比較多的XMPP協議服務器固然是openfire最爲流行(我感受)。至於如何搭建oprenfire 二次開發環境而且將代碼跑起來,這一篇不介紹了,後面下一篇介紹,也許會有點順序亂的感受,可是主要仍是我最近兩天再搞IM整合現有系統用戶。因此這一遍是記錄篇也是發出來和你們一塊兒分享心得(畢竟網上不少博客是沒有通過驗證的理論篇),我這裏都是通過實際環境而且經過測試的,不然我不會記錄。在這裏咱們須要兩份源代碼,由於在配置中咱們會進行源碼調試,一方面咱們要讀openfire源碼,另外一方面咱們要一個客戶端登陸XMPP服務器聊天驗證,首先上着兩份源碼在eclipse中的結構(後面會記錄如何搭建源碼環境而且將源碼跑起來)mysql

圖1程序員

首先Openfire 的源碼使用的是最新的3.10.2版本,客戶端Spark 是pc客戶端,使用的是最新的2.7.2版本,如上圖所示。sql

首先描述一下業務場景,公司有一個現有的OA系統,是.NET(C#語言)平臺下開發的,使用SqlServer數據庫。讓後給OA加上即時聊天功能,原本是打算維護兩份用戶數據,後來瞭解到現有OA的用戶是密碼是MD5加密,而openfire默認是Blowfish加密,這個時候若是是新建用戶還好,可是之前在使用的OA系統中MD5加密的用戶怎麼辦??若是直接導入到IM用戶表中確定是沒法使用的,這個時候就須要整合現有用戶表,openfire中的用戶表廢棄,只使用現有系統中的用戶表,OA系統和openfire都是經過OA系統用戶表登陸,因此須要整合。而後就免不了分析openfire源碼,纔有了下面的文字,根據openfire源碼讓你知其然知其因此然。不然只知道這樣配置,而不知道爲何這樣配置,那就很差了,凡事弄明明白白(程序猿精神)。數據庫

openfire整合現有系統用戶緩存

首先明確個人現有系統是一個SqlServer數據庫,IM也是sqlserver(固然混合數據庫也是能夠的,已經這樣作過IM是mysql,就有系統是SqlServer)。服務器

一.配置provider.auth.classNameapp

 

private static void initProvider() {
        // Convert XML based provider setup to Database based
        JiveGlobals.migrateProperty("provider.auth.className");

        String className = JiveGlobals.getProperty("provider.auth.className",
                "org.jivesoftware.openfire.auth.DefaultAuthProvider");
        // Check if we need to reset the auth provider class 
        if (authProvider == null || !className.equals(authProvider.getClass().getName())) {
            try {
                Class c = ClassUtils.forName(className);
                authProvider = (AuthProvider)c.newInstance();
            }
            catch (Exception e) {
                Log.error("Error loading auth provider: " + className, e);
                authProvider = new DefaultAuthProvider();
            }
        }
    }

由openfire源碼中AuthFactory類咱們知道它的靜態函數中調用了這個initProvider()這個靜態函數初始化了一些配置,而後經過這個配置構造了一個AuthProvider。這個配置的鍵爲provider.auth.className,默認使用的是org.jivesoftware.openfire.auth.DefaultAuthProvider類,若是咱們配置provider.auth.className那麼就使用配置的類,而後咱們就能夠在eclipse

openfire源碼中找DefaultAuthProvider類 繼承自JDBCAuthProvider,繼承自AuthProvider類徹底符合要求,在數據庫中修改ofProperty表相應的值,以下圖:ide

圖2

這樣用戶驗證就是經過org.jivesoftware.openfire.auth.JDBCAuthProvider來進行行驗證了。咱們繼續跟蹤openfire的java源碼,進入JDBCAuthProvider類,它的構造函數代碼以下:

圖3

由圖3很容易知道,咱們要配置各類參數以下:

驅動: jdbcProvider.driver

鏈接字符串:jdbcProvider.connectionString

查詢密碼的SQL語句:jdbcAuthProvider.passwordSQL

密碼的加密類型:jdbcAuthProvider.passwordType

設置密碼的SQL語句:jdbcAuthProvider.setPasswordSQL

是否容許修改密碼(由後面的源碼知道true或者false):allowUpdate 

那麼咱們如今來一個一個跟蹤源碼講解整合用戶。

1.配置驅動jdbcProvider.driver  這裏是SQL server數據庫因此用 net.sourceforge.jtds.jdbc.Driver。

2.配置鏈接字符串jdbcProvider.connectionString  爲: jdbc:jtds:sqlserver://192.168.11.21:1433/OA_frame;appName=jive;user=sa;password=mm  替換成你本身的

3.配置查詢密碼字符串jdbcAuthProvider.passwordSQL 爲: select UserPwd from BT_User where UserName=?  這裏的 UserName是用戶登陸名稱,UserPwd就是密碼字段,BT_User就是用戶表。爲何是這樣請看下面源代碼就懂了:

 

圖5 

 4.配置密碼加密類型jdbcAuthProvider.passwordType   爲md5  ,可是必定要注意要小些字符串"md5"若是問爲何,那是由於openfire源碼中不認識"MD5"這種大寫。這個支持哪些加密方式呢??很容易有下面的枚舉知道:plain不加密,md5,sha1,sha256,sha512這些加密方式

 1  public enum PasswordType {
 2 
 3         /**
 4          * The password is stored as plain text.
 5          */
 6         plain,
 7 
 8         /**
 9          * The password is stored as a hex-encoded MD5 hash.
10          */
11         md5,
12 
13         /**
14          * The password is stored as a hex-encoded SHA-1 hash.
15          */
16         sha1,
17         
18         /**
19          * The password is stored as a hex-encoded SHA-256 hash.
20          */
21         sha256,
22               
23         /**
24           * The password is stored as a hex-encoded SHA-512 hash.
25           */
26         sha512;
27    }

5. 設置 修改密碼SQL腳本jdbcAuthProvider.setPasswordSQL  根據本身的須要設置修改密碼腳本,根據源碼能夠知道它也是把用戶登陸名做爲條件查詢修改的,也就是修改制定登陸名用 戶的密碼。

6. 配置是否容許修改密碼allowUpdate    若是配置了jdbcAuthProvider.setPasswordSQL 就插入true吧。不然jdbcAuthProvider.setPasswordSQL 配置的就沒有用了,看代碼爲何

圖6

經過圖6制定爲何了吧??:)

 

二.配置provider.user.className

 咱們配置provider.user.className爲 org.jivesoftware.openfire.user.JDBCUserProvider 請看上面圖2。這個配置好了,那麼咱們就要配置相關屬性了。看下圖代碼:

 圖7

 很容易看出在這裏咱們要配置哪些屬性:

1.jdbcProvider.driver(上面已經配置)

2.jdbcProvider.connectionString(上面已經配置)

3.jdbcUserProvider.loadUserSQL

4.jdbcUserProvider.userCountSQL

5.jdbcUserProvider.allUsersSQL

6.jdbcUserProvider.searchSQL

7.jdbcUserProvider.usernameField

8.jdbcUserProvider.nameField

9.jdbcUserProvider.emailField

1.配置加載用戶信息SQL腳本jdbcUserProvider.loadUserSQL  是根據登陸名查詢用戶信息的字符串 select RealName,Email from BT_User where UserName=? 咱們再看看源碼:

 圖8

 由上面圖8知道,咱們查詢只須要查詢出用戶名(不是登陸名),郵箱就好了,其它的查詢出來也沒什麼用,並且字段順序要正確哦(看源碼知道用戶第一次被加載後就放入了緩存)。

2.配置查詢用戶數量腳本jdbcUserProvider.userCountSQL 爲:select count(*) from  BT_User   這個就沒什麼好說明的了

3.配置用戶登陸名字段 jdbcUserProvider.usernameField  咱們這裏就是UserName了

4.配置用戶名jdbcUserProvider.nameField 爲:RealName  這裏是暱稱或者是真實姓名,這個就看你具體業務了由於這個是要展現給用戶看到的

5.配置郵箱字段jdbcUserProvider.emailField 爲:Email 就是用戶郵箱沒什麼可說的

結束:

 上面圍繞配置JDBCAuthProvider和JDBCUserProvider 到這裏就完成了,重啓openfire而後這個時候從新登陸用戶發現如今所用的用戶就是舊有系統中的用戶了,用戶整合完成(至少也只是用戶數據整合完成)。更多的配置:若是你係統中有用戶部門什麼的,還有若是你但願openfire支持整合後用戶有更多操做那麼還須要配置其它東西,我就不一個個說明,可是遵循這種源碼跟蹤思路足夠應付各類配置,已經配置中出現的問題。

綜合配置點:

一):provider.auth.className

  驅動: jdbcProvider.driver

  鏈接字符串:jdbcProvider.connectionString

  查詢密碼的SQL語句:jdbcAuthProvider.passwordSQL

  密碼的加密類型:jdbcAuthProvider.passwordType

  設置密碼的SQL語句:jdbcAuthProvider.setPasswordSQL

  是否容許修改密碼(由後面的源碼知道true或者false):allowUpdate 

二):provider.auth.className

  jdbcProvider.driver(上面已經配置)

  jdbcProvider.connectionString(上面已經配置)

  jdbcUserProvider.loadUserSQL

  jdbcUserProvider.userCountSQL

  jdbcUserProvider.allUsersSQL

  jdbcUserProvider.searchSQL

  jdbcUserProvider.usernameField

  jdbcUserProvider.nameField

  jdbcUserProvider.emailField

後記:

有興趣或者有問題的能夠加上面的QQ羣討論有什麼問題諮詢的歡迎打擾。商業合做固然更歡迎

相關文章
相關標籤/搜索