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&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
问题四:
<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服务器
来源:oschina
链接:https://my.oschina.net/u/140593/blog/225835