[记录] Openfire集成现有系统数据库用户

基于Openfire 3.7.1

参考文档:

官方文档

Custom Database Integration Guide

——参考该文档介绍需要配置的参数, 在conf/openfire.xml中编辑属性, 实际为在管理控制台或数据库中添加系统属性

背景

假设已存在MySQL数据库office, 且数据库中有3张表users(用户表)groups(分组表)groupusers(用户所属分组表)

目标

使用office数据库中的usersgroupsgroupusers表替代Openfire中的ofuserofgroupofgroupuser三个表, 从而整合现有系统用户

users表包含的属性(对应于Openfire原数据库中的ofuser表):

属性名 说明
uid用于登录,假如uid为admin,则jid为admin@domain
name用户名
pwd密码
email电子邮件
CREATE TABLE `users` (
  `uid` varchar(64) NOT NULL,
  `pwd` varchar(32) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

groups表包含的属性(对应于Openfire原数据库中的ofgroup表):

属性名 说明
groupName组名
description描述
CREATE TABLE `groups` (
  `groupName` varchar(50) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`groupName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

groupusers表包含的属性(对应于Openfire原数据库中的ofgroupuser表):

属性名 说明
groupName对应于groups表的groupName
uid对应于user表的uid
admin是否是管理员, 1是, 0否
CREATE TABLE `groupusers` (
  `groupName` varchar(50) NOT NULL,
  `uid` varchar(100) NOT NULL,
  `admin` tinyint(4) NOT NULL,
  PRIMARY KEY (`groupName`,`uid`,`admin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

注:表中属性名不一定要一样, 关键是“说明”部分, 此处参考Openfire原有数据库中的表创建

进入Openfire管理控制台-》服务器-》服务器管理器-》系统属性, 默认系统属性:

属性名 说明 属性值
httpbind.enabled
true
passwordKey
hidden
provider.admin.className
org.jivesoftware.openfire.admin.DefaultAdminProvider
provider.auth.className 验证 org.jivesoftware.openfire.auth.DefaultAuthProvider
provider.group.className 组相关 org.jivesoftware.openfire.group.DefaultGroupProvider
provider.lockout.className
org.jivesoftware.openfire.lockout.DefaultLockOutProvider
provider.securityAudit.className 用户相关 org.jivesoftware.openfire.security.DefaultSecurityAuditProvider
provider.user.className
org.jivesoftware.openfire.user.DefaultUserProvider
provider.vcard.className
org.jivesoftware.openfire.vcard.DefaultVCardProvider
update.lastCheck
1351559310961
xmpp.auth.anonymous
true
xmpp.domain 域名,服务器IP 192.168.0.46
xmpp.httpbind.scriptSyntax.enabled
true
xmpp.session.conflict-limit
0
xmpp.socket.ssl.active
true

首先修改三个属性(openfire提供了支持JDBC相关的Provider, 可以从其它的数据源获取用户/组数据):

属性名 属性值
provider.auth.className org.jivesoftware.openfire.auth.JDBCAuthProvider
provider.group.className org.jivesoftware.openfire.group.JDBCGroupProvider
provider.user.className org.jivesoftware.openfire.user.JDBCUserProvider

接着配置数据源(添加系统属性, 这里使用的是mysql数据库):

属性名 说明 属性值
jdbcProvider.driver 数据源驱动 com.mysql.jdbc.Driver
jdbcProvider.connectionString 连接字符串,需要集成的数据库地址 jdbc:mysql://localhost:3306/office?user=root&password=123456

这里的配置可参考

其中, 相应数据库的driver必须放在Openfire安装目录的"lib/"文件夹中(默认安装Openfire后就有了)。

对每一个JDBC Provider需要添加相关系统属性

JDBCAuthProvider

属性名 说明 输入值 输出列 属性值
jdbcAuthProvider.passwordSQL 获取用户密码的SQL 登录名 密码 select pwd from users where uid=?
jdbcAuthProvider.passwordType 密码类型

plain(文本) | md5 | sha1 | sha256 |sha512, 如果密码加密不为前面几种, 就需要自己提供一个AuthProvide, 如果没有设置, 默认为plain

JDBCUserProvider

属性名 说明 输入值 输出列 属性值
jdbcUserProvider.allUsersSQL 获取所有用户
用户的uid select uid from users
jdbcUserProvider.loadUserSQL 获取用户信息 用户uid 用户名,email select name,email from users where uid=?
jdbcUserProvider.userCountSQL 获取用户数量
用户数量 select count(*) from users
jdbcUserProvider.searchSQL !!这边略有疑问!!

select uid from users where
jdbcUserProvider.usernameField 指定用户登录名的列名

uid
jdbcUserProvider.nameField 指定用户名称的列名

name
jdbcUserProvider.emailField 指定用户email的列名

email

JDBCGroupProvider

属性名 说明 输入值 输出列 属性值
jdbcGroupProvider.allGroupsSQL 获取所有组的SQL
组名 select groupName from groups
jdbcGroupProvider.descriptionSQL 获取组描述 组名 组描述 select description from groups where groupName=?
jdbcGroupProvider.groupCountSQL 获取组的数量
组的数量 select count(*) from groups
jdbcGroupProvider.loadAdminsSQL 获取组的管理员 组名 组管理员 select uid from groupusers where groupName=? and admin=1
jdbcGroupProvider.loadMembersSQL 获取组的成员 组名 组成员uid select uid from groupusers where groupName=? and admin=0
jdbcGroupProvider.userGroupsSQL 获取成员的组 成员uid 成员所属组名 select groupName from groupusers where uid=?

注意:其中获取组的管理员和组的成员中的判断要根据相应系统修改, 我这边假设admin值为1时是管理员, 值为0时是成员

最后, 配置新的管理员用户(应该在users表中添加一个用户作为管理员)

属性名 说明 属性值
admin.authorizedJIDs 指定新数据源中的管理员用户, 注意是是完整JID(user@域名) admin@192.168.0.46

注:官方文档写的配置admin.authorizedUsernames, 但是配置后似乎不起效果

注:表中红色字体部分为需要根据具体数据库进行修改的部分.

配置好后, 重启Openfire。

使用admin.authorizedJIDs中的用户名登录Openfire管理控制台(admin.authorizedJIDs配置为admin@192.168.0.46, 则用户名为admin).

如果配置成功, 进入Openfire管理控制台-》用户/组就可以看到你数据源中的用户/组信息了。

注: 在修改添加系统属性的过程中, 若无法登录Openfire管理控制台, 可直接修改Openfire数据库中的ofproperty表.

懒惰的程序猿——使用SQL语句修改

;
;//-----------------------------------------------------------------------------------------------------------
UPDATE `openfire`.`ofProperty` SET propValue='org.jivesoftware.openfire.auth.JDBCAuthProvider' WHERE name='provider.auth.className';
UPDATE `openfire`.`ofProperty` SET propValue='org.jivesoftware.openfire.group.JDBCGroupProvider' WHERE name='provider.group.className';
UPDATE `openfire`.`ofProperty` SET propValue='org.jivesoftware.openfire.user.JDBCUserProvider' WHERE name='provider.user.className';

INSERT INTO `openfire`.`ofProperty` VALUES
 ('jdbcProvider.driver', 'com.mysql.jdbc.Driver'),
 ('jdbcProvider.connectionString', 'jdbc:mysql://localhost:3306/office?user=root&password=123456'),
 ('admin.authorizedJIDs', 'admin@localhost,admin@192.168.0.46'),
 ('jdbcAuthProvider.passwordSQL', 'SELECT pwd FROM users WHERE uid=?'),
 ('jdbcAuthProvider.passwordType', 'plain'),
 ('jdbcUserProvider.allUsersSQL', 'SELECT uid FROM users'),
 ('jdbcUserProvider.loadUserSQL', 'SELECT name,email FROM users WHERE uid=?'),
 ('jdbcUserProvider.userCountSQL', 'SELECT COUNT(*) FROM users'),
 ('jdbcUserProvider.searchSQL', 'SELECT uid FROM users WHERE'),
 ('jdbcUserProvider.usernameField', 'uid'),
 ('jdbcUserProvider.nameField', 'name'),
 ('jdbcUserProvider.emailField', 'email');
 ('jdbcGroupProvider.allGroupsSQL', 'SELECT groupName FROM groups'),
 ('jdbcGroupProvider.descriptionSQL', 'SELECT description FROM groups WHERE groupName=?'),
 ('jdbcGroupProvider.groupCountSQL', 'SELECT COUNT(*) FROM groups'),
 ('jdbcGroupProvider.loadAdminsSQL', 'SELECT uid FROM groupusers WHERE groupName=? AND admin=1'),
 ('jdbcGroupProvider.loadMembersSQL', 'SELECT uid FROM groupusers WHERE groupName=? AND admin=0'),
 ('jdbcGroupProvider.userGroupsSQL', 'SELECT groupName from groupusers WHERE uid=?');
;//-----------------------------------------------------------------------------------------------------------