openfire集成已有数据库

0问题场景

    假如我们有一个网站并且已经有了上百万的注册用户,现在要集成一个IM即时聊天功能,假如我们使用开源的xmpp服务器,都会自动生成默认的数据库以及表结构,用已有数据库的用户表去初始化IM服务器的用户表,不仅麻烦而且涉及到同步问题。所以xmpp服务器都提供了集成数据库的功能。我们可以通过配置修改,把登录认证,用户查询,用户分组等信息,从IM服务器的默认数据库剥离出来。tigase目前只支持mysql,pgsql,derby三种数据库集成,openfire支持的比较多。本文讲的是openfire集成oracle。

1官方文档

官方文档:Custom Database Integration Guide

2问题解决

问题一:

<jdbcProvider>
    <driver>com.mysql.jdbc.Driver</driver>
    <connectionString>jdbc:mysql://localhost/dbname?user=username&amp;password=secret</connectionString>
  </jdbcProvider>

文档中只提供了mysql的外接数据库连接方式,如果是oracle的数据库就要注意了,按照上面的那种拼接时错误的

Oracle的connectionString的字符串应该是 jdbc:oracle:thin:username/password@ip:1521:dbname

driver:oracle.jdbc.driver.OracleDriver 还有需要把oracle连接的jar放在lib目录下  比如ojdbc14.jar(用于oracle9)

问题二:

<provider>
    <auth>
      <className>org.jivesoftware.openfire.auth.JDBCAuthProvider</className>
    </auth>
    <user>
      <className>org.jivesoftware.openfire.user.JDBCUserProvider</className>
    </user>
  </provider>
  <jdbcAuthProvider>
     <passwordSQL>SELECT password FROM user_account WHERE username=?</passwordSQL>
     <passwordType>plain</passwordType>
  </jdbcAuthProvider>
  <jdbcUserProvider>
     <loadUserSQL>SELECT name,email FROM myUser WHERE username=?</loadUserSQL>
     <userCountSQL>SELECT COUNT(*) FROM myUser</userCountSQL>
     <allUsersSQL>SELECT username FROM myUser</allUsersSQL>
     <searchSQL>SELECT username FROM myUser WHERE</searchSQL>
     <usernameField>username</usernameField>
     <nameField>name</nameField>
     <emailField>email</emailField>
  </jdbcUserProvider>

第一次配置时,只配置了auth认证,以及auth查询的sql(<auth><jdbcAuthProvider>)

结果一直登录不上   后来才知道auth认证和user查询必须同时修改

文档中有写If you enable user integration you must also enable authentication integration (see above).

如果使用user的集成,必须使用auth认证,可是没说auth认证必须也要配置user查询

问题三:

 conf/openfire.xml 下的配置,其实是在admin管理页的系统属性中也可以配置

最后作用于默认数据库的opproperty表

在xml中修改了auth.JDBCAuthProvider和 user.JDBCUserProvider  但是重启后没有起作用

在系统属性中还是DefaultAuthProvider和DefaultUserProvider 需要在系统属性页再进行修改

参考博文:http://blog.csdn.net/duotiger/article/details/24307607

openfire集成已有数据库_第1张图片

问题四:

 <admin>
        ...
        <authorizedUsernames>joe, jane</authorizedUsernames>
      </admin>

 文档中For example, to let the usersnames "joe" and "jane" login to the admin console:

 这里其实是配置了两个管理员username,这两个账号必须在本地数据库的user表中存在

问题五:

group配置成功后,可以在后台 用户/组 查询中看见组,但是具体某个组的详情页却无法打开

同时客户端用户登录后也无法查看到对应组的信息

通过查询比对后发现,组比如开启共享属性,用户才能再客户端查看

集成的用户组,默认不是共享的,所以无法看到,这里应该是openfire的一个bug

需要ofgroupprop表 添加组的共享信息 

比如集成数据库有个分组 叫做公司,显示在客户端,用户的分组名称同事

并且只有组内的成员才能看见组  只有这三条记录存在 集成数据库的组信息 才能看到

3总结

按照配置,用户认证,用户信息,用户分组可以通过配置的数据库连接和查询sql,使用已有的数据库信息

IM的相关逻辑和程序都不用发生变化,这也正好满足我们的项目需要  但是openfire的性能可能有点问题

所以在实际应用中,要综合考虑,选择适用的一个xmpp服务器




你可能感兴趣的:(openfire集成已有数据库)