OpenFire源码学习之二十八:与其他系统的用户整合

与三方系统整合。Openfire提供了一套不错的解决方案。其实openfire的用户插件也做http方式的用户数据同步。关于openfire的用户整合,本人也不是十分赞同(这仅仅只是在我们自己的项目下)。我们的办法是做数据共享池。这个解决方案可以用到redis。

下面是opnfire的 解决方案

openfire可以非常方便的整合现有系统用户。 进入openfire管理控制台-服务器-服务管理器-系统属性 可以发现如下配置 :

以下Provider是openfire默认自己管理用户组


属性名


属性值


描述


provider.auth.className


org.jivesoftware.openfire.auth.DefaultAuthProvider


用户验证


provider.group.className


org.jivesoftware.openfire.group.DefaultGroupProvider


获取组相关数据


provider.user.className


org.jivesoftware.openfire.user.DefaultUserProvider


获取用户相关数据

除了of自己本身的属性外,另外为了支持其他数据的整合openfire还提供了支持JDBC相关的Provider,可以从其它的数据源获取用户/组数据 。配置非常简单只需要将上面三个属性分别修改为 :

l org.jivesoftware.openfire.auth.JDBCAuthProvider

l org.jivesoftware.openfire.group.JDBCGroupProvider

l org.jivesoftware.openfire.user.JDBCUserProvider

然后,需要配置以下数据源,添加如下属性

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.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([email protected]域名)


admin@1 92.168.2.104

配置好后,重启Openfire。

使用admin.authorizedJIDs中的用户名登录Openfire管理控制台(admin.authorizedJIDs配置为[email protected],则用户名为admin)如果配置成功,进入Openfire管理控制台-》用户/组就可以看到你数据源中的用户/组信息了。

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

除了以上在控制台修改之外,也可以直接操作ofProperty数据库表

insert into ofproperty( name, propValue) values( 'admin.authorizedJIDs' , '[email protected]');
insert into ofproperty( name, propValue) values( 'jdbcAuthProvider.passwordSQL','select pwd from users where
  name=?');
insert into ofproperty( name, propValue) values( 'jdbcAuthProvider.passwordType' , 'plain');
Insert into ofproperty(name,propValue)values('jdbcProvider.connectionString' 'jdbc:jtds:sqlserver://192.169.1.120
  :1433/test_openfire_jcdb;appName=jive;user=sa;password=hytest');
insert into ofproperty( name, propValue) values( 'jdbcProvider.driver' , 'net.sourceforge.jtds.jdbc.Driver' );
insert into ofproperty( name, propValue) values( 'jdbcUserProvider.allUsersSQL', 'select name from users' );
insert into ofproperty( name, propValue) values( 'jdbcUserProvider.emailField' ,'email');
insert into ofproperty( name, propValue) values('jdbcUserProvider.loadUserSQL' ,'select * from users where uid=?');
insert into ofproperty( name, propValue) values( 'jdbcUserProvider.nameField', 'name');
insert into ofproperty( name, propValue) values('jdbcUserProvider.userCountSQL', 'select count(name) from
   users');
insert into ofproperty( name, propValue) values( 'jdbcUserProvider.usernameField' , 'name' );
UPDATE ofproperty SET propValue ='org.jivesoftware.openfire.auth.JDBCAuthProvider' WHERE
  NAME='provider.auth.className';
UPDATE ofproperty SET propValue='org.jivesoftware.openfire.user.JDBCUserProvider' WHERE
  NAME='provider.user.className';
UPDATE ofproperty SET propValue='192.168.2.104' WHERE NAME='xmpp.domain'; 
时间: 2024-10-08 01:31:25

OpenFire源码学习之二十八:与其他系统的用户整合的相关文章

OpenFire源码学习之二十九:集群

集群 Openfire的给集群提供了多种方案.一种是基于Hazelcast插件,还有基于Oracle的coherence插件. Linux集群配置 一.修改配置文件 /etc/hosts文件 openfire1 192.168.2.104 openfire2192.168.2.240 每台主机都需要配置 二.添加jar包 将coherence.jar.coherence-work.jar.tangosol.jar添加到lib目录 将clustering.jar放到plugins下面 Hazelc

OpenFire源码学习之二十:在openfire中使用redis插件(下)

Redis插件实现 首先来看下插件目录: RedisServicePlugin 源码清单: import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.jivesoftware.database.DbConnecti

OpenFire源码学习之二十二:openfie对用户的优化(下)

用户名片 在预初始化中,贴出来用户名片的程序.这里也一样不在重复. 首先同样先修改系统属性: provider.vcard.className org.jivesoftware.util.redis.expand.RedisVCardProvider 然后需要修改VCardManager名片管理这个类. RedisVCardProvider: import redis.clients.jedis.Jedis; public class RedisVCardProvider implements

OpenFire源码学习之二十五:消息回执与离线消息(下)

这一篇紧接着上面继续了. 方案二 基于redis的消息回执.主要流程分为下面几个步骤: 1)将消息暂存储与redis中,设置好消息的过期时间 2)客户端回执消息id来消灭暂存的消息 3)开通单独线程论坛在第1)步中的消息.根据消息的时间重新发送消息.如果消息第一次存放的时间大雨有效期(自定义10秒),解析消息中的to查找用户是否还在线.如果在则T掉(因为它长时间不理会服务的重要命令),如果不在线则将消息放置离线表. OK,先来看看消息的存储格式吧. 1.MESSAGE消息 用户集合 SADD 

OpenFire源码学习之二十一:openfie对用户的优化(上)

用户类 优化用户主要是要解决用户的连接量.已经对用户的访问速度和吞吐量. 预初始化 在前面的带面中提出来了用户的预初始化.这里就不在贴出来了.下面将redis用户库连接池处理贴出来UserJedisPoolManager public class UserJedisPoolManager extends BasicModule{ private static final Logger log = LoggerFactory.getLogger(UserJedisPoolManager.class

OpenFire源码学习之二十三:关于消息的优化处理

消息处理 之前有说过,openfire的消息处理策略本人并不是很喜欢.先看下openfire上脱机消息策略. 个人认为消息关于会话的消息,用户的存储量应该无限大.服务器不应该被消息吃撑了.所谓聊天通讯,这一关很重要. Openfire的消息是什么流程呢. 1.当用户登陆连接的时候.握手.认证.绑定资源.获取花名册.获取离线消息. 2.服务端会查找关系型数据库.经本人测试离线消息在数据库表中达到100万条以上的时候,查询速度非常慢,甚至会导致openfire奔溃. ..... 那么openfire

OpenFire源码学习之二十七:Smack源码解析

Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即时通讯和聊天.Android中开发通讯APP也可以使用这个包.关于smack的中文开发文档,目前网上也有很多. 下面本,将从源码中分析smack的几个案例. 连接 关于smack的Connection是连接XMPP服务器的默认实现.他有两个构造函数,一个是XMPPConecttion(String) 接收服务器地址名的参数.这个是默认的比较常用的构造方法. l 查找一个DNS的SRC,首先需要找到它精确的服务器地址和端口默

three.js 源码注释(二十八)Cameras/Camera.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中Cameras/Camera.js文件的注释. 更多更新在 : https://git

yii2源码学习笔记(二十)

Widget类是所有部件的基类.yii2\base\Widget.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http://www.yiiframework.com/license/ 6 */ 7 8 namespace yii\base; 9 10 use Yii; 11 use Reflectio