假如我们有一个网站并且已经有了上百万的注册用户,现在要集成一个IM即时聊天功能,假如我们使用开源的xmpp服务器,都会自动生成默认的数据库以及表结构,用已有数据库的用户表去初始化IM服务器的用户表,不仅麻烦而且涉及到同步问题。所以xmpp服务器都提供了集成数据库的功能。我们可以通过配置修改,把登录认证,用户查询,用户分组等信息,从IM服务器的默认数据库剥离出来。tigase目前只支持mysql,pgsql,derby三种数据库集成,openfire支持的比较多。本文讲的是openfire集成oracle。
官方文档:Custom Database Integration Guide
<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表 添加组的共享信息
比如集成数据库有个分组 叫做公司,显示在客户端,用户的分组名称同事
并且只有组内的成员才能看见组 只有这三条记录存在 集成数据库的组信息 才能看到
按照配置,用户认证,用户信息,用户分组可以通过配置的数据库连接和查询sql,使用已有的数据库信息
IM的相关逻辑和程序都不用发生变化,这也正好满足我们的项目需要 但是openfire的性能可能有点问题
所以在实际应用中,要综合考虑,选择适用的一个xmpp服务器