Openfire集成现有系统数据库用户

tsolin 2013-07-13

转自: http://zoeyyoung.gitcafe.com/openfire-xmpp-database.html

 

 

参考文档:

官方文档

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域名,服务器IP192.168.0.46
xmpp.httpbind.scriptSyntax.enabled true
xmpp.session.conflict-limit 0
xmpp.socket.ssl.active true

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

属性名属性值
provider.auth.classNameorg.jivesoftware.openfire.auth.JDBCAuthProvider
provider.group.classNameorg.jivesoftware.openfire.group.JDBCGroupProvider
provider.user.classNameorg.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获取所有用户 用户的uidselect uid from users
jdbcUserProvider.loadUserSQL获取用户信息用户uid用户名,emailselect 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=? andadmin=1
jdbcGroupProvider.loadMembersSQL获取组的成员组名组成员uidselect 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=?');
;//-----------------------------------------------------------------------------------------------------------

相关推荐

moyazheng / 0评论 2013-06-29