鏈接:http://blog.csdn.net/unicorn_520/article/details/7700018
openfire服務(wù)器配置,先跳過介紹,我想在文章里用到的時(shí)候再插入一些介紹肮雨。
openfire擴(kuò)展小試 整合現(xiàn)有系統(tǒng)用戶
如果我想使用現(xiàn)有系統(tǒng)的用戶/組(部門),而不想使用openfire再去管理一套用戶/組,用openfire可以非常方便的整合現(xiàn)有系統(tǒng)用戶拦止。
注意:在集成成功后屠尊,使用的用戶就是你集成系統(tǒng)的數(shù)據(jù)庫旷祸,而不是你原來在openfire里配置的數(shù)據(jù)庫了,原來的openfire數(shù)據(jù)庫依然有用讼昆,只是用戶表ofuser不不能用了托享,因?yàn)槿绻苡茫敲从脩糍~號就可能重復(fù)浸赫,因?yàn)椴荒軆商子脩舯怼?/b>
進(jìn)入openfire管理控制臺-服務(wù)器-服務(wù)管理器-系統(tǒng)屬性
可以發(fā)現(xiàn)如下配置
provider.auth.className
org.jivesoftware.openfire.auth.DefaultAuthProvider
*用戶驗(yàn)證
provider.group.className
org.jivesoftware.openfire.group.DefaultGroupProvider
*獲取組相關(guān)數(shù)據(jù)
provider.user.className
org.jivesoftware.openfire.user.DefaultUserProvider
*獲取用戶相關(guān)數(shù)據(jù)
這些Provider是openfire默認(rèn)自己管理用戶組
但同時(shí)openfire還提供了支持JDBC相關(guān)的Provider闰围,可以從其它的數(shù)據(jù)源獲取用戶/組數(shù)據(jù)
將上面三個(gè)屬性分別修改為
org.jivesoftware.openfire.auth.JDBCAuthProvider
org.jivesoftware.openfire.group.JDBCGroupProvider
org.jivesoftware.openfire.user.JDBCUserProvider
然后,需要配置一下數(shù)據(jù)源既峡,添加如下屬性
jdbcProvider.driver
*數(shù)據(jù)源驅(qū)動
jdbcProvider.connectionString
*連接字符串
對每一個(gè)JDBC Provider需要配置相關(guān)的SQL語句和屬性(在系統(tǒng)屬性里添加項(xiàng)目)
JDBCAuthProvider
jdbcAuthProvider.passwordSQL
*獲取用戶密碼的SQL
*輸入?yún)?shù):登錄名
*輸入列:密碼
*例:SELECT pwd FROM user WHERE name=?
jdbcAuthProvider.passwordType
*密碼類型可以是:plain(文本),md5,sha1
*如果你的密碼加密不為以上三種 就需要自己提供一個(gè)AuthProvider羡榴,在下一章會專門介紹
JDBCGroupProvider
jdbcGroupProvider.allGroupsSQL
*獲取所有組的SQL
*輸入?yún)?shù):無
*輸出列:組的KEY
*例:SELECT sn FROM department
jdbcGroupProvider.descriptionSQL
*獲取組的名稱(描述)
*輸入?yún)?shù):組記錄的KEY
*輸出列:組的名稱(描述)
*例:SELECT name FROM department where sn=?
jdbcGroupProvider.groupCountSQL
*獲取組的數(shù)量
*輸入?yún)?shù):組的KEY
*輸出列:組的數(shù)量
*例:SELECT count(sn) FROM department
jdbcGroupProvider.loadAdminsSQL
*獲取組的管理員
*輸入?yún)?shù):組記錄的KEY
*輸出列:組管理員的KEY
*例:SELECT admin FROM department where sn=?
jdbcGroupProvider.loadMembersSQL
*獲取組的成員
*輸入?yún)?shù):組的KEY
*輸出列:組成員的KEY(集合)
*例:SELECT usersn FROM department_user where departmentsn=?
jdbcGroupProvider.userGroupsSQL
*獲取成員的組
*輸入?yún)?shù):成員的KEY
*輸出列:成員所性組的KEY
*例:SELECT departmentsn FROM department_user where usersn=?
JDBCUserProvider
jdbcUserProvider.allUsersSQL
*獲取所有用戶
*輸入?yún)?shù):無
*輸出列:用戶的KEY
*例:SELECT sn from user
jdbcUserProvider.userCountSQL
*獲取所有用戶數(shù)量
*輸入?yún)?shù):無
*輸出列:用戶數(shù)量
*例:SELECT count(sn) from user
jdbcUserProvider.loadUserSQL
*獲取用戶信息
*輸入?yún)?shù):用戶的KEY
*輸出列:登錄名,名稱,email(至少應(yīng)該這三列运敢,下面要用到)
*例:SELECT loginname,name,email from user where sn =?
jdbcUserProvider.emailField
*指定用戶email的列名如:email
jdbcUserProvider.nameField
*指定用戶名稱的列名如:name
jdbcUserProvider.usernameField
*指定用戶登錄名的列名如:loginname
最后 還需要配置新的管理員用戶
admin.authorizedJIDs
*指定新數(shù)據(jù)源中的管理員用戶注意是是完整JID(user@域名)
*例:admin@server.cn
配置好如上屬性 重啟openfire
使用admin.authorizedJIDs中的用戶名登錄openfire管理控制臺
如果配置成功校仑,進(jìn)入openfire管理控制臺-用戶/組
就可以看到你數(shù)據(jù)源中的用戶/組信息了
同時(shí)可以使用spark登錄進(jìn)行測試
此外,如果在調(diào)試過程中出現(xiàn)問題 無法登錄openfire管理控制臺
(這里需要注注意的是在屬性amdin.authorizedJIDs的值如設(shè)置成者冤,那么這里的abc就是openfire后臺管理的管理員名肤视,并且這個(gè)管理員的信息不是在我們原來的openfire指定的數(shù)據(jù)庫里的管理員,而是在待集成系統(tǒng)的的數(shù)據(jù)庫那里名為abc的管理員涉枫,當(dāng)然我們也可以配置SQL來指定管理員從待集成信息的那個(gè)表時(shí)獲取出來邢滑。)
可以直接修改openfire數(shù)據(jù)庫中的 OFPROPERTY表
經(jīng)測試,可以集成現(xiàn)有系統(tǒng)愿汰,例子如下:
我的IP為 192.168.1.102 困后,使用的是mysql數(shù)據(jù)庫
現(xiàn)有系統(tǒng)庫為sns,其中有張user表衬廷,字段:id,email,password,name
為了集成摇予,首先:
修改ofproperty表,將修改之后的內(nèi)容如下(這里boy就是管理員的名字)
admin.authorizedJIDsboy@192.168.1.102
jdbcAuthProvider.passwordSQL????? ?select password from user where id=?
jdbcAuthProvider.passwordType????? plain //加密方式 還有其他的機(jī)密方式
"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
注:紅色為修改的內(nèi)容
重啟openfire服務(wù)器即可.
以后登陸需要輸入id,password.有人會問了吗跋,為什么用id而不用email呢侧戴?
這是因?yàn)閑mail中帶有符號,而在openfire中會用于記錄服務(wù)器的域名跌宛。所以會有沖突酗宋。
況且,openfire作為IM集成到現(xiàn)有系統(tǒng)中時(shí)疆拘,走的登陸是隱式登陸蜕猫,即嵌入到原有系統(tǒng)的登陸方式中。
對用戶而言透明哎迄。
問題:
但是回右,需要解決的問題在客戶端顯示時(shí)隆圆,現(xiàn)有spark是顯示的id,jwchat估計(jì)也是翔烁,需要修改一下渺氧,使其對用戶而言只顯示用戶名!如果能夠解決租漂,那么對于現(xiàn)有系統(tǒng)而言阶女,基本無任何改動。
現(xiàn)有系統(tǒng)庫為myim哩治,其中有張user表秃踩,字段:id,email,password,name,與上面不同的是id這里我設(shè)它不自動自增业筏,name
即作用戶顯示名也作賬號登陸使用(實(shí)際使用中要分開憔杨,這里只作個(gè)小測試),password為用戶登陸密碼蒜胖∠穑可以在openfire數(shù)據(jù)庫時(shí)執(zhí)行如下SQL語句來集成現(xiàn)有系統(tǒng)的用戶表:
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','admin@127.0.0.1'),
('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 可以查看英文版的