即时聊天IM之二 openfire 整合现有系统用户

合肥程序员群:49313181。    合肥实名程序员群:128131462 (不肯透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

 综述:java

天天利用中午时间更新下这个知识点的的博客若是感兴趣的以为更新慢了也别介意(其它时间仍是以工做为主,学习工做两不误,哈哈……)。上一篇我纯理论上简单讲解了一下XMPP协议,然而如今用的比较多的XMPP协议服务器固然是openfire最为流行(我感受)。至于如何搭建oprenfire 二次开发环境而且将代码跑起来,这一篇不介绍了,后面下一篇介绍,也许会有点顺序乱的感受,可是主要仍是我最近两天再搞IM整合现有系统用户。因此这一遍是记录篇也是发出来和你们一块儿分享心得(毕竟网上不少博客是没有通过验证的理论篇),我这里都是通过实际环境而且经过测试的,不然我不会记录。在这里咱们须要两份源代码,由于在配置中咱们会进行源码调试,一方面咱们要读openfire源码,另外一方面咱们要一个客户端登陆XMPP服务器聊天验证,首先上着两份源码在eclipse中的结构(后面会记录如何搭建源码环境而且将源码跑起来)mysql

图1程序员

首先Openfire 的源码使用的是最新的3.10.2版本,客户端Spark 是pc客户端,使用的是最新的2.7.2版本,如上图所示。sql

首先描述一下业务场景,公司有一个现有的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.classNameapp

 

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那么就使用配置的类,而后咱们就能够在eclipse

openfire源码中找DefaultAuthProvider类 继承自JDBCAuthProvider,继承自AuthProvider类彻底符合要求,在数据库中修改ofProperty表相应的值,以下图:ide

图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这些加密方式

 1  public enum PasswordType {
 2 
 3         /**
 4          * The password is stored as plain text.
 5          */
 6         plain,
 7 
 8         /**
 9          * The password is stored as a hex-encoded MD5 hash.
10          */
11         md5,
12 
13         /**
14          * The password is stored as a hex-encoded SHA-1 hash.
15          */
16         sha1,
17         
18         /**
19          * The password is stored as a hex-encoded SHA-256 hash.
20          */
21         sha256,
22               
23         /**
24           * The password is stored as a hex-encoded SHA-512 hash.
25           */
26         sha512;
27    }

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群讨论有什么问题咨询的欢迎打扰。商业合做固然更欢迎

相关文章
相关标签/搜索