Openfire集成现有系统数据库用户
转自: http://zoeyyoung.gitcafe.com/openfire-xmpp-database.html
参考文档:
官方文档
Custom Database Integration Guide
——参考该文档介绍需要配置的参数, 在conf/openfire.xml中编辑属性, 实际为在管理控制台或数据库中添加系统属性
背景
假设已存在MySQL数据库office, 且数据库中有3张表users(用户表)、groups(分组表)和groupusers(用户所属分组表)
目标
使用office数据库中的users、groups、groupusers表替代Openfire中的ofuser、ofgroup、ofgroupuser三个表, 从而整合现有系统用户
users表包含的属性(对应于Openfire原数据库中的ofuser表):
属性名 | 说明 |
uid | 用于登录,假如uid为admin,则jid为admin@domain |
name | 用户名 |
pwd | 密码 |
电子邮件 |
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的列名 |
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=? andadmin=1 |
jdbcGroupProvider.loadMembersSQL | 获取组的成员 | 组名 | 组成员uid | select uid from groupusers where groupName=? andadmin=0 |
jdbcGroupProvider.userGroupsSQL | 获取成员的组 | 成员uid | 成员所属组名 | select groupName from groupusers where uid=? |
注意:其中获取组的管理员和组的成员中的判断要根据相应系统修改, 我这边假设admin值为1时是管理员, 值为0时是成员
最后, 配置新的管理员用户(应该在users表中添加一个用户作为管理员)
属性名 | 说明 | 属性值 |
admin.authorizedJIDs | 指定新数据源中的管理员用户, 注意是是完整JID(user@域名) | [email protected] |
注:官方文档写的配置admin.authorizedUsernames, 但是配置后似乎不起效果
注:表中红色字体部分为需要根据具体数据库进行修改的部分.
配置好后, 重启Openfire。
使用admin.authorizedJIDs中的用户名登录Openfire管理控制台(admin.authorizedJIDs配置为[email protected], 则用户名为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,[email protected]'),
('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=?');
;//-----------------------------------------------------------------------------------------------------------