我要說的是改變openfire密碼驗證方式的方案,情形是這樣的:在openfire預設的驗證方式,主要藉助DefaultAuthProvider,以登入操作為例,由BlowFish類提供加解密方案並由AuthFactory來管理對BlowFish的調用,從而完成使用者輸入密碼的校正過程,具體過程大家可以跟代碼,不過比較肯定的一點是openfire伺服器在收到<auth />節的訊息後開始校正工作的。
我看了網上的一些關於使用者整合的資料,這個是openfire官方的資料http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/db-integration-guide.html,這個是某網友整理的資料http://hi.baidu.com/tonent/blog/item/8e4d00d536f477cf50da4b3b.html,可能站的高度比較高吧,說的也比較清楚,只是在我具體實現時會有各種各樣的疑問。我目的是修改密碼的加密方式,改為MD5加密,我的思路是藉助JDBCAuthProvider驗證登入,通過繼承JDBCUserProvider重寫createUser和deleteUser方法這樣的方式,來建立刪除使用者。之所以選擇繼承是為了遵循閉合原則,保持原openfire的完成性,可以把繼承類寫在外掛程式裡,只要在配置provider.user.className參數時指定它的全路徑名即可。注意新的isReadOnly()要return
false,也就是告訴外部的調用者,該類(UserProvider)還可以完成修改資料的工作。
具體操作和上述連結所講的差不多,不過由於我在開發中沒有用到組的資料,所以provider.group.className仍取預設值,個人感覺這樣做應該沒什麼問題。有點需要注意的是jdbcProvider.connectionString的值問題,如果直接在ofproperty表中添加資料可以直接寫,如jdbc:mysql://localhost/dbName?user=user&password=password&useUnicode=true&characterEncoding=utf-8,不過在xml文檔裡配置的話要把&寫成&這樣的形式。還有指定jdbcAuthProvider.passwordType為md5(想要的加密方式),不過查看JDBCAuthProvider的類注釋可以看到它只支援plain,md5,sha1,sha256,sha512等加密方式,若是不在這個範圍之內,要寫自己的AuthProvider的。
如果上面說的不是很明白的話,一定要看代碼,包括業務代碼還有各種注釋。通過堆疊追蹤具體的執行流程,我把DefaultAuthProvider和JDBCAuthProvider驗證方式的堆棧調用貼出來吧,都是登入操作的代碼執行過程。
上面是Default的,下面的是JDBC的,要注意DigestMD5Server和SaslServerPlainImpl的處理,最後都會交給XMPPCallbackHandler。前一種是在收到<response />節的內容開始的,後一種是收到<auth />節後開始。