目前我使用的Openfire版本是3.10.3,以下使用说明也是在这个版本上做的修改。
Openfire提供了两种方式使用用户数据表。一种是安装完成之后默认实现的org.jivesoftware.openfire.user.DefaultUserProvider,一种是org.jivesoftware.openfire.user.JDBCUserProvider,同样对于用户验证也提供了默认实现的org.jivesoftware.openfire.auth.DefaultAuthProvider,一种是org.jivesoftware.openfire.auth.JDBCAuthProvider。前者都是基于安装时候填的数据库表上建立用户表的。如果要想使用自己的用户表或者基于现有的用户表,则需要使用后者。
使用自定义的用户表方法有两种,一种是修改配置文件,一种是登录系统修改系统属性。
修改配置文件
打开Openfire的安装目录,找到conf/openfire.xml配置文件,这个是Openfire加载系统属性的文件,加入以下配置即可修改一些系统属性。
- 增加管理员
Openfire默认的登录管理员名称是admin,这里可以进行修改。
1 <admin> 2 <authorizedUsernames>joe, jane</authorizedUsernames> 3 </admin>
以上定义有两个用户名为joe和jane的用户可以登录管理控制台。
- 使用自定义的数据库连接
1 <jdbcProvider> 2 <driver>com.mysql.jdbc.Driver</driver> 3 <connectionString>jdbc:mysql://localhost/dbname?user=username&password=secret</connectionString> 4 </jdbcProvider>
- 自定义认证集成,openfire中默认使用的是md5加密密码的。
1 <provider> 2 <auth> 3 <className>org.jivesoftware.openfire.auth.JDBCAuthProvider</className> 4 </auth> 5 </provider> 6 <jdbcAuthProvider> 7 <passwordSQL>SELECT password FROM user_account WHERE username=?</passwordSQL> 8 <passwordType>plain</passwordType> 9 </jdbcAuthProvider>
这里需要说明className是不能更改的字符串,passwordSQL是查询数据表的sql语句,passwordType是密码的加密方式,有plain、md5、sha1、sha256、sha512等几种字符串可填入。
- 用户数据集成,官方说明,如果使用了用户数据集成,那么就必须使用认证集成。示例如下:
1 <provider> 2 <auth> 3 <className>org.jivesoftware.openfire.auth.JDBCAuthProvider</className> 4 </auth> 5 <user> 6 <className>org.jivesoftware.openfire.user.JDBCUserProvider</className> 7 </user> 8 </provider> 9 <jdbcAuthProvider> 10 <passwordSQL>SELECT password FROM user_account WHERE username=?</passwordSQL> 11 <passwordType>plain</passwordType> 12 </jdbcAuthProvider> 13 <jdbcUserProvider> 14 <loadUserSQL>SELECT name,email FROM myUser WHERE username=?</loadUserSQL> 15 <userCountSQL>SELECT COUNT(*) FROM myUser</userCountSQL> 16 <allUsersSQL>SELECT username FROM myUser</allUsersSQL> 17 <searchSQL>SELECT username FROM myUser WHERE</searchSQL> 18 <usernameField>username</usernameField> 19 <nameField>name</nameField> 20 <emailField>email</emailField> 21 </jdbcUserProvider>
其中,user和auth里面的className是Openfire内置的类名,不能更改。jdbcUserProvider是Openfire提供的一些获取用户数据的方法。因为用到自己定义的表,所以字段和表名可能不同,所以必须自定义sql。需要定义的方法有
a. loadUserSQL : 根据用户名查询用户信息,包括名称和邮件。语句后有一个“?”,这个问号会被username替换掉。
b. userCountSQL: 查询用户总数。
c. searchSQL : 查询用户。where后面没有接入任何字符串,jdbcUserProvider会根据填入查询的用户名或者名称邮件等自动加进去查询。如果没有查询条件将不起作用。
d. usernameField: 在自定义数据表中username的字段名。用于以上的sql查询。
e. nameField: 在自定义数据表中name的字段名。用于以上的sql查询。
f. emailField:在自定义数据表中email的字段名。用户以上的sql查询。
- 分组集成,如果要使用自己的用户分组,那么也需要加入认证集成,这里认证集成就不再写了,仅展示分组集成配置。
1 <provider> 2 <group> 3 <className>org.jivesoftware.openfire.group.JDBCGroupProvider</className> 4 </group> 5 </provider>
其中group中的className是固定的。
1 <jdbcGroupProvider> 2 <groupCountSQL>SELECT count(*) FROM myGroups</groupCountSQL> 3 <allGroupsSQL>SELECT groupName FROM myGroups</allGroupsSQL> 4 <userGroupsSQL>SELECT groupName FROM myGroupUsers WHERE username=?</userGroupsSQL> 5 <descriptionSQL>SELECT groupDescription FROM myGroups WHERE groupName=?</descriptionSQL> 6 <loadMembersSQL>SELECT username FROM myGroupUsers WHERE groupName=? AND isAdmin='N'</loadMembersSQL> 7 <loadAdminsSQL>SELECT username FROM myGroupUsers WHERE groupName=? AND isAdmin='Y'</loadAdminsSQL> 8 </jdbcGroupProvider>
以上配置简单说明:
a. groupCountSQL: 查询组个数,
b. allGroupsSQL: 查询所有的分组。
c. userGroupsSQL: 根据用户名查询分组。
d. descriptionSQL: 根据组名查询分组描述。
e. loadMembersSQL: 根据组名加载分组里面所有的成员。
f. loadAdminsSQL: 根据组名查询分组里所有的管理员。