Openfire整合第三方(现有)用户系统

我使用的是MySQL作为Openfire的数据库,自有系统(只是测试)的数据库也采用的MySQL。

首先我新创建了一个数据库作为自有数据库进行测试,数据库名为 testdb,然后在testdb中新建了用户表users(username,password,name,email),并新增了几个用户信息作为测试。

修改Openfire服务器的系统属性

登录到Openfire管理平台(默认为 localhost:9090),配置完成后(配置过程很简单,网上也有很多相关文章可供参考),进入【服务器】->【服务器管理器】-> 【系统属性】 ,当然你也可以直接修改Openfire的数据库,对应的数据表为 ofproperty 。
Openfire整合第三方(现有)用户系统

1. 现有系统数据库连接配置

你需要配置你自有的用户系统的数据库连接参数,以用于Openfire连接到你自有的数据库并进行相关校验、查询等数据库操作。

新增以下属性值:

  • jdbcProvider.driver
    设置数据库驱动,我的是MySQL数据库,所以驱动为:com.mysql.cj.jdbc.Driver

  • jdbcProvider.connectionString
    数据库连接地址:jdbc:mysql://localhost:3306/testdb?username=数据库连接用户名&password=数据库连接密码
    Openfire整合第三方(现有)用户系统

2. 修改身份验证程序相关配置

进入【服务器】->【服务器管理器】-> 【系统属性】,修改以下属性值:

  • provider.auth.className
    将该值(org.jivesoftware.openfire.auth.DefaultAuthProvider)修改为

org.jivesoftware.openfire.auth.JDBCAuthProvider
Openfire整合第三方(现有)用户系统
DefaultAuthProvider与JDBCAuthProvider均实现了AuthProvider接口,用于实现用户登录校验。

因为我是在github上拉取的源码,配置后运行的Openfire项目,所有我们一起来看下源码中对应的类:
Openfire整合第三方(现有)用户系统
JDBCAuthProvider允许你通过连接任何你可以使用JDBC连接的数据库

JDBC身份验证提供了一个允许你根据任何一个你可以使用JDBC连接上的数据库对用户进行身份验证的程序。它也可以和 HybridAuthProvider 一起使用进行身份验证,这样你可以拥有不会污染外部数据的XMPP用户。

还需设置以下属性值:

属性名 属性值 说明
jdbcAuthProvider.passwordType SELECT password FROM users WHERE username=? 查询用户密码SQL
jdbcAuthProvider.passwordType plain (因为是测试,密码类型我就直接设置为明文模式,而实际使用中明文的情况很少。) 密码类型有以下几种值可以配置:plain、md5、sha1、sha256、sha512、bcryptBcrypt(支持作为密码类型;但是,当链接密码类型时,它必须是最后给定的类型。bcrypt散列每次生成时都不同), 若不配置则默认为 plain 明文模式。 jdbcAuthProvider.passwordType 也可以接受以逗号分隔的密码类型字符串,这在存储旧(ex/md5)密码散列,然后“升级”为更强大的散列算法的情况下非常有用。Hash算法从左到右执行。例如 ‘md5,sha1’.
jdbcAuthProvider.allowUpdate true 是否允许修改用户密码
jdbcAuthProvider.setPasswordSQL UPDATE users SET password=? where username=? 设置用户密码SQL
jdbcAuthProvider.bcrypt.cost 10 bcrypt密码类型的配置值,默认值:10

如果不想使用 jdbcProvider.connectionString 属性值连接数据库进行校验,可配置 jdbcAuthProvider.useConnectionProvider = true. 以下为JDBCAuthProvider中的变量,对应以上配置的属性值:
Openfire整合第三方(现有)用户系统

3. 修改用户系统操作程序相关配置

进入【服务器】->【服务器管理器】-> 【系统属性】,修改以下属性值:

  • provider.user.className
    将该值(org.jivesoftware.openfire.auth.DefaultUserProvider)修改为
    org.jivesoftware.openfire.auth.JDBCUserProvider
    Openfire整合第三方(现有)用户系统
    DefaultUserProvider与JDBCUserProvider均实现了UserProvider接口,用于实现用户的增删改查等操作。

JDBCUserProvider允许你使用外部数据库来定义用户,最好是和JDBCAuthProvider联合使用。所有数据皆为read-only,即不可进行增删改操作。

还需配置以下属性值:

属性名 属性值 说明
jdbcUserProvider.loadUserSQL SELECT name,email FROM users WHERE username = ? 加载用户SQL
jdbcUserProvider.userCountSQL SELECT COUNT(*) FROM users 查询用户数量SQL
jdbcUserProvider.allUsersSQL SELECT username,name,email FROM users 查询所有用户信息SQL
jdbcUserProvider.searchSQL SELECT username,name,email FROM users WHERE (根据关键字Username、Name、Email)搜索用户SQL
jdbcUserProvider.usernameField username 自有数据库用户数据表(testdb.users)的对应的用户账号字段
jdbcUserProvider.nameField name 自有数据库用户数据表(testdb.users)的对应的用户名称字段
jdbcUserProvider.emailField email 自有数据库用户数据表(testdb.users)的对应的用户邮箱字段

同上,如果不想使用 jdbcProvider.connectionString 属性值连接数据库进行用户查询等操作,可配置 jdbcUserProvider.useConnectionProvider = true. 以下为JDBCUserProvider中使用的变量,对应以上配置的属性值:
Openfire整合第三方(现有)用户系统
Openfire整合第三方(现有)用户系统

4. 设置管理员JID,用于登录Openfire管理平台

配置属性值:

  • admin.authorizedJIDs
    该属性值表示Openfire的管理员账号JID,格式为:[email protected],即用户账号@Openfire服务器域名。可配置多个,多个以逗号隔开。我配置其值为 [email protected].
    Openfire整合第三方(现有)用户系统

所有配置都修改好后,重启Openfire服务,使用刚刚配置的管理员账号密码登录Openfire管理平台查看用户信息等。