天天看點

openfire整合現有系統使用者

以下内容是從别人的部落格裡複制過來的,原文位址:http://blog.csdn.net/unicorn_520/article/details/7700018。

我在這裡需要特别強調的是connectionString的配置值項:

--------------------------------------------------------------------------------------------------------------------------

我按照從網上搜的資料,一步步設定屬性,最後總是無法用admin使用者登陸控制台。後來從一個群裡的朋友給發了一套他的ofproperty表裡的配置資訊

我發現,裡面的内容大緻相同,但有一個地方不一樣,就是connectionString:

jdbc:oracle:thin:userName/[email protected]:1521:ORCL,

我把自己的connectionString改成這個後,再重新開機,就可以了。

原來,網上的資料都是mysql資料庫為例作的配置,很奇怪為什麼傳統的url方式不好使。

----------------------------------------------------------------------------------------------------------------------------------------------------------

openfire伺服器配置,先跳過介紹,我想在文章裡用到的時候再插入一些介紹。

openfire擴充小試 整合現有系統使用者

如果我想使用現有系統的使用者/組(部門),而不想使用openfire再去管理一套使用者/組,用openfire可以非常友善的整合現有系統使用者。

注意:在內建成功後,使用的使用者就是你內建系統的資料庫,而不是你原來在openfire裡配置的資料庫了,原來的openfire資料庫依然有用,隻是使用者表ofuser不不能用了,因為如果能用,那麼使用者賬号就可能重複,因為不能兩套使用者表。

進入openfire管理控制台-伺服器-服務管理器-系統屬性

可以發現如下配置

provider.auth.className

org.jivesoftware.openfire.auth.DefaultAuthProvider

*使用者驗證

provider.group.className

org.jivesoftware.openfire.group.DefaultGroupProvider

*擷取組相關資料

provider.user.className

org.jivesoftware.openfire.user.DefaultUserProvider

*擷取使用者相關資料

這些Provider是openfire預設自己管理使用者組

但同時openfire還提供了支援JDBC相關的Provider,可以從其它的資料源擷取使用者/組資料

将上面三個屬性分别修改為

org.jivesoftware.openfire.auth.JDBCAuthProvider

org.jivesoftware.openfire.group.JDBCGroupProvider

org.jivesoftware.openfire.user.JDBCUserProvider

然後,需要配置一下資料源,添加如下屬性

jdbcProvider.driver

*資料源驅動

jdbcProvider.connectionString

*連接配接字元串

對每一個JDBC Provider需要配置相關的SQL語句和屬性(在系統屬性裡添加項目)

JDBCAuthProvider

jdbcAuthProvider.passwordSQL

*擷取使用者密碼的SQL

*輸入參數:登入名

*輸入列:密碼

*例:SELECT pwd FROM user WHERE name=?

jdbcAuthProvider.passwordType

*密碼類型可以是:plain(文本),md5,sha1

*如果你的密碼加密不為以上三種 就需要自己提供一個AuthProvider,在下一章會專門介紹

JDBCGroupProvider

jdbcGroupProvider.allGroupsSQL

*擷取所有組的SQL

*輸入參數:無

*輸出列:組的KEY

*例:SELECT sn FROM department

jdbcGroupProvider.descriptionSQL

*擷取組的名稱(描述)

*輸入參數:組記錄的KEY

*輸出列:組的名稱(描述)

*例:SELECT name FROM department where sn=?

jdbcGroupProvider.groupCountSQL

*擷取組的數量

*輸入參數:組的KEY

*輸出列:組的數量

*例:SELECT count(sn) FROM department

jdbcGroupProvider.loadAdminsSQL

*擷取組的管理者

*輸入參數:組記錄的KEY

*輸出列:組管理者的KEY

*例:SELECT admin FROM department where sn=?

jdbcGroupProvider.loadMembersSQL

*擷取組的成員

*輸入參數:組的KEY

*輸出列:組成員的KEY(集合)

*例:SELECT usersn FROM department_user where departmentsn=?

jdbcGroupProvider.userGroupsSQL

*擷取成員的組

*輸入參數:成員的KEY

*輸出列:成員所性組的KEY

*例:SELECT departmentsn FROM department_user where usersn=?

JDBCUserProvider

jdbcUserProvider.allUsersSQL

*擷取所有使用者

*輸入參數:無

*輸出列:使用者的KEY

*例:SELECT sn from user

jdbcUserProvider.userCountSQL

*擷取所有使用者數量

*輸入參數:無

*輸出列:使用者數量

*例:SELECT count(sn) from user

jdbcUserProvider.loadUserSQL

*擷取使用者資訊

*輸入參數:使用者的KEY

*輸出列:登入名,名稱,email(至少應該這三列,下面要用到)

*例:SELECT loginname,name,email from user where sn =?

jdbcUserProvider.emailField

*指定使用者email的列名如:email

jdbcUserProvider.nameField

*指定使用者名稱的列名如:name

jdbcUserProvider.usernameField

*指定使用者登入名的列名如:loginname

最後 還需要配置新的管理者使用者

admin.authorizedJIDs

*指定新資料源中的管理者使用者注意是是完整JID([email protected]域名)

*例:[email protected]

配置好如上屬性 重新開機openfire

使用admin.authorizedJIDs中的使用者名登入openfire管理控制台

如果配置成功,進入openfire管理控制台-使用者/組

就可以看到你資料源中的使用者/組資訊了

同時可以使用spark登入進行測試

此外,如果在調試過程中出現問題 無法登入openfire管理控制台

(這裡需要注注意的是在屬性amdin.authorizedJIDs的值如設定成,那麼這裡的abc就是openfire背景管理的管理者名,并且這個管理者的資訊不是在我們原來的openfire指定的資料庫裡的管理者,而是在待內建系統的的資料庫那裡名為abc的管理者,當然我們也可以配置SQL來指定管理者從待內建資訊的那個表時擷取出來。)

可以直接修改openfire資料庫中的 OFPROPERTY表

經測試,可以內建現有系統,例子如下:

我的IP為 192.168.1.102 ,使用的是mysql資料庫

現有系統庫為sns,其中有張user表,字段:id,email,password,name

為了內建,首先:

修改ofproperty表,将修改之後的内容如下(這裡boy就是管理者的名字)

admin.authorizedJIDs [email protected]

jdbcAuthProvider.passwordSQL select password from user where id=?

jdbcAuthProvider.passwordType plain //加密方式 還有其他的機密方式

  • "plain" (the password is stored as plain text)
  • "md5" (the password is stored as a hex-encoded MD5 hash)
  • "sha1" (the password is stored as a hex-encoded SHA-1 hash)
  • "sha256" (the password is stored as a hex-encoded SHA-256 hash)
  • "sha512" (the password is stored as a hex-encoded SHA-512 hash)

jdbcProvider.connectionString jdbc:mysql://localhost:3306/sns?user=root&password=123456

jdbcProvider.driver com.mysql.jdbc.Driver

jdbcUserProvider.allUsersSQL select id from user

jdbcUserProvider.emailField email

jdbcUserProvider.loadUserSQL select name,email from user where id=?

jdbcUserProvider.nameField name

jdbcUserProvider.userCountSQL select count(*) from user

jdbcUserProvider.usernameField name

passwordKey f46L75p2QsuKCQy //加密串

provider.admin.className org.jivesoftware.openfire.admin.DefaultAdminProvider

provider.auth.className org.jivesoftware.openfire.auth. JDBCAuthProvider

provider.group.className org.jivesoftware.openfire.group.DefaultGroupProvider

provider.lockout.className org.jivesoftware.openfire.lockout.DefaultLockOutProvider

provider.securityAudit.className org.jivesoftware.openfire.security.DefaultSecurityAuditProvider

provider.user.className org.jivesoftware.openfire.user. JDBCUserProvider

provider.vcard.className org.jivesoftware.openfire.vcard.DefaultVCardProvider

update.lastCheck 1262616901497

xmpp.auth.anonymous true

xmpp.domain 192.168.1.102

xmpp.session.conflict-limit 0

xmpp.socket.ssl.active true

注:紅色為修改的内容

重新開機openfire伺服器即可.

以後登陸需要輸入id,password.有人會問了,為什麼用id而不用email呢?

這是因為email中帶有符号,而在openfire中會用于記錄伺服器的域名。是以會有沖突。

況且,openfire作為IM內建到現有系統中時,走的登陸是隐式登陸,即嵌入到原有系統的登陸方式中。

對使用者而言透明。

問題:

但是,需要解決的問題在用戶端顯示時,現有spark是顯示的id,jwchat估計也是,需要修改一下,使其對使用者而言隻顯示使用者名!如果能夠解決,那麼對于現有系統而言,基本無任何改動。

現有系統庫為myim,其中有張user表,字段:id,email,password,name,與上面不同的是id這裡我設它不自動自增,name

即作使用者顯示名也作賬号登陸使用(實際使用中要分開,這裡隻作個小測試),password為使用者登陸密碼。可以在openfire資料庫時執行如下SQL語句來內建現有系統的使用者表:

Sql代碼

insert into ofproperty(name,propValue)values

('jdbcProvider.driver','com.mysql.jdbc.Driver'),

('jdbcProvider.connectionString','jdbc:mysql://localhost/myim?user=root&password=&useUnicode=true&characterEncoding=utf8'),

('admin.authorizedJIDs','[email protected]'),

('jdbcAuthProvider.passwordSQL','SELECT password FROM user WHERE name=?'),

('jdbcAuthProvider.passwordType','plain'),

('jdbcUserProvider.loadUserSQL','SELECT name,email FROM user WHERE name=?'),

('jdbcUserProvider.userCountSQL','SELECT COUNT(*) FROM user'),

('jdbcUserProvider.allUsersSQL','SELECT name FROM user'),

('jdbcUserProvider.usernameField','name'),

('jdbcUserProvider.nameField','name'),

('jdbcUserProvider.emailField','email');

UPDATE ofProperty SET propValue='org.jivesoftware.openfire.user.JDBCUserProvider' WHERE

name='provider.user.className';

UPDATE ofProperty SET propValue='org.jivesoftware.openfire.auth.JDBCAuthProvider' WHERE

name='provider.auth.className';

在of的自帶的documentation/db-integration-guide.html 可以檢視英文版的