与三方系统整合。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的列名 |
|
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';