即时聊天IM之二 openfire 整合现有系统用户
Q Q:408365330 E-Mail:egojit@qq.com
综述:
每天利用中午时间更新下这个知识点的的博客如果感兴趣的觉得更新慢了也别介意(其它时间还是以工作为主,学习工作两不误,哈哈……)。上一篇我纯理论上简单讲解了一下XMPP协议,然而现在用的比较多的XMPP协议服务器当然是openfire最为流行(我感觉)。至于如何搭建oprenfire 二次开发环境并且将代码跑起来,这一篇不介绍了,后面下一篇介绍,也许会有点顺序乱的感觉,但是主要还是我最近两天再搞IM整合现有系统用户。所以这一遍是记录篇也是发出来和大家一起分享心得(毕竟网上很多博客是没有经过验证的理论篇),我这里都是经过实际环境并且通过测试的,否则我不会记录。在这里我们需要两份源代码,因为在配置中我们会进行源码调试,一方面我们要读openfire源码,另一方面我们要一个客户端登录XMPP服务器聊天验证,首先上着两份源码在eclipse中的结构(后面会记录如何搭建源码环境并且将源码跑起来)


图1
首先Openfire 的源码使用的是最新的3.10.2版本,客户端Spark 是pc客户端,使用的是最新的2.7.2版本,如上图所示。
首先描述一下业务场景,公司有一个现有的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.className
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那么就使用配置的类,然后我们就可以在
openfire源码中找DefaultAuthProvider类 继承自JDBCAuthProvider,继承自AuthProvider类完全符合要求,在数据库中修改ofProperty表相应的值,如下图:

图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这些加密方式
public enum PasswordType {
/**
* The password is stored as plain text.
*/
plain,
/**
* The password is stored as a hex-encoded MD5 hash.
*/
md5,
/**
* The password is stored as a hex-encoded SHA-1 hash.
*/
sha1,
/**
* The password is stored as a hex-encoded SHA-256 hash.
*/
sha256,
/**
* The password is stored as a hex-encoded SHA-512 hash.
*/
sha512;
}
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群讨论有什么问题咨询的欢迎打扰。商业合作当然更欢迎
即时聊天IM之二 openfire 整合现有系统用户的更多相关文章
- 即时聊天APP(二) - MainActivity
主活动包含三个Fragment,分别是会话.联系人和设置,初始布局隐藏所有碎片,然后把应该显示的显示出来: //隐藏所有Fragment private void hideAll(){ Fragmen ...
- 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com smack ...
- 关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
http://blog.csai.cn/user1/265/archives/2005/2465.html 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collec ...
- 几款web版整合(QQ、msn、icq、yahoo通、Gtalk等)即时聊天http://hi.baidu.com/ejie/blog/item/e89794ef9a9431efce1b3ebd.html
直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,很方便.在此将时汇总,便于大家查找,节约大家一点时间. 此都是官 ...
- 高仿QQ即时聊天软件开发系列之二登录窗口界面
继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因 ...
- web 直播&即时聊天------阿里云、融云(二)
上一篇简要主要介绍了融云制作聊天室的基本方法,这次基本属于对上一篇的补充以及进阶...^_^... (ps:吐槽一下,加了三个融云的线下qq群,全部没人解决问题,也不知道建此群的意义,若是民间的话就当 ...
- web 直播&即时聊天------阿里云、融云(三)
经过前面的知识,基本已经把聊天室的功能搞定了,剩下的就是直播的问题了... 一如既往,阿里云的web demo也是少的可怜,只有一个web播放器(Prismplayer),所以这里主要就此播放器踩的坑 ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
随机推荐
- [MKRCVCD]Burning SDK report AddFile error
在使用Pipe通信的使用,我使用GetProcessExitCode这个函数来获取返回值.而ExitCode的定义为DWORD DWORD的原型为unsigned long,在32位程序中,DWORD ...
- CI框架--事务
CI框架中事务封装的很完善,使用起来很简单 1.不开启事务 //不开启事务 前两个sql 能够执行成功,第三个执行失败 $this->device_model->addForCamera( ...
- Mysql查询重复记录
第一步 使用group by 和 having cout 查找重复字段 SELECT t1.`order_book_id` FROM `quant_stock_info` t1 GROUP BY t1 ...
- android应用刷新系统多媒体库(增加or删除多媒体文件)
系统:android4.4及其以上 功能:app中拍照, 并实现浏览.删除照片操作. 实现: 1.拍照,存储到指定路径path 2.通知系统多媒体数据库刷新数据. 主要使用MediaScannerCo ...
- 20161014006 DataGridView Combobox 数据绑定与传值
//Combobox private void T_Form_CY_CBD_D_CurrentCellChanged(object sender, EventArgs e) ...
- 学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite* spBG = CCSprite::create("&qu ...
- 没人能阻止你,除了你自己——Keep up the good work!
今天在网上搜索一些关于计算机专业的论坛或者博客,于是发现了博客园,就进来了.我想把我的一些关于计算机科学与技术领域的学习经历纪录在此,以便于能和大家一起分享,一起努力,一起进步.说实话我是临床医学专业 ...
- '"千"第一周学习情况记录
一周过去了,今天将我这一周的学习内容和主要感想记录与此和大家共同分享,一起进步.我将自己的学习计划命名为"千",因为我喜欢这个字,希望能用此来鼓舞自己不断前进.时间总是很快的,这一 ...
- SublimeText个性化快捷键设置
一.光标跳出括号 在编写js函数的时候,输入函数名和括号的时候,要想光标跳出括号还得手动的按left键.离两个手的区域比较远,可自行配置 preferences - keys bindings - u ...
- MySQL自定义函数
用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 自定义函数两个必要条件: 参数:可以有另个或多个 返回值:只能有一个 创建自定 ...