与三方系统整合。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(user@域名) | 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';