以下内容是從别人的部落格裡複制過來的,原文位址: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 可以檢視英文版的