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

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

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

下面是opnfire的 解决方案

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

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

以下Provideropenfire默认自己管理用户组

属性名 

属性值

描述

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,可以从其它的数据源获取用户/组数据 。配置非常简单只需要将上面三个属性分别修改为 

org.jivesoftware.openfire.auth.JDBCAuthProvider 

org.jivesoftware.openfire.group.JDBCGroupProvider 

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(user@域名)

admin@1 92.168.2.104

配置好后,重启Openfire

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

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

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

insert into ofproperty( name, propValue) values( 'admin.authorizedJIDs' , 'admin@192.168.2.104');                                             
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';