OpenFire用户认证使用外部数据库
OpenFire就不介绍了,功能很强大。用过OpenFire的会发现,在OpenFire的数据库中会发现ofuser表,该表就是登陆控制台用户(eg:http://localhost:9090)和 认证用户表(eg:用户spark做客户端,OpenFire做服务器,登陆发送消息)。
首先,不建议直接看此方法。再次之前,建议看一下OpenFire官方的文档。熟悉一下 使用外部数据库认证用户的大致思路
文档在openfire_src\documentation\docs\index.html
看Custom Database Integration Guide 用户数据整合指南
1. 官方文档说明:
按照官方的文档说明,理论在openfire_src_3_9_1\target\openfire\conf\openfire.xml这个文件中,直接加节点就可以了。但是最后没有行通,我是修改的数据库。
<jive>
<jdbcProvider>
<driver>com.mysql.jdbc.Driver</driver>
<connectionString>jdbc:mysql://localhost/dbname?user=username&password=secret</connectionString>
</jdbcProvider>
<provider>
<auth>
<className>org.jivesoftware.openfire.auth.JDBCAuthProvider</className>
</auth>
<user>
<className>org.jivesoftware.openfire.user.JDBCUserProvider</className>
</user>
</provider>
<jdbcAuthProvider>
<passwordSQL>SELECT password FROM user_account WHERE username=?</passwordSQL>
<passwordType>plain</passwordType>
</jdbcAuthProvider>
<jdbcUserProvider>
<loadUserSQL>SELECT name,email FROM myUser WHERE username=?</loadUserSQL>
<userCountSQL>SELECT COUNT(*) FROM myUser</userCountSQL>
<allUsersSQL>SELECT username FROM myUser</allUsersSQL>
<searchSQL>SELECT username FROM myUser WHERE</searchSQL>
<usernameField>username</usernameField>
<nameField>name</nameField>
<emailField>email</emailField>
</jdbcUserProvider>
</jive>
这里用在另外一个项目中的account表来说明一下:
account表结构和ofuser表一样。只是把encryptedPassword作为存储md5加密的密码
jdbcProvider.driver com.mysql.jdbc.Drive//数据库驱动类
jdbcProvider.connectionString jdbc:mysql://localhost:3306/myspring?user=root&password=admin //连接数据库的url包括用户名,密码
provider.auth.className org.jivesoftware.openfire.auth.JDBCAuthProvider//用户登陆认证类
jdbcAuthProvider.passwordSQL SELECT plainPassword FROM account WHERE username=? //通过用户名查询密码的sql
jdbcAuthProvider.passwordType md5 //密码加密方式 可选:plain(不加密),md5,sha1,sha256,sha512
provider.user.className org.jivesoftware.openfire.user.JDBCUserProvider //查看用户的类,控制台查看用户/组
jdbcUserProvider.loadUserSQL SELECT name,email FROM account WHERE username=? //查询用户信息的sql
jdbcUserProvider.userCountSQL SELECT COUNT(*) FROM account//查询总数
jdbcUserProvider.allUsersSQL SELECT username FROM account//查询所有用户
jdbcUserProvider.searchSQL SELECT username FROM account WHERE//搜索用户(sql这样写,在控制台就可以通过用户名搜索)
jdbcUserProvider.usernameField username //指定控制台用户名对应的字段
jdbcUserProvider.nameField name //控制台名称对应的字段
jdbcUserProvider.emailField email //控制台电子邮件对应的字段
这里会发现两个类。有兴趣可以看一下OpenFire源码中 JDBCAuthProvider、JDBCUserProvider。这些sql在类的注释中都有demo
2. 修改数据库的方法:
把这些数据添加到ofproperty表中即可.
eg:
INSERT INTO `ofproperty` VALUES ('jdbcProvider.driver', 'com.mysql.jdbc.Driver');
provider.auth.className、provider.user.className这两条数据有的话添加会报错,修改就可以。
另外一种方式是登陆控制台,
服务器 -- 〉 服务器管理器 --〉 系统属性
eg:
属性名:jdbcProvider.driver
属性值:com.mysql.jdbc.Driver
把上面的属性都添加上去(属性名重复的会自动覆盖)
这里提供添加ofproperty表的sql.需要根据表结构的不同,做修改
INSERT INTO `ofproperty` VALUES ('jdbcProvider.driver', 'com.mysql.jdbc.Driver');
INSERT INTO `ofproperty` VALUES ('jdbcProvider.connectionString', 'jdbc:mysql://localhost:3306/myspring?user=root&password=admin');
UPDATE ofproperty SET propValue = 'org.jivesoftware.openfire.auth.JDBCAuthProvider' WHERE `name` = 'provider.auth.className';
INSERT INTO `ofproperty` VALUES ('jdbcAuthProvider.passwordSQL', 'SELECT encryptedPassword FROM account WHERE username=?');
INSERT INTO `ofproperty` VALUES ('jdbcAuthProvider.passwordType', 'md5');
UPDATE ofproperty SET propValue = 'org.jivesoftware.openfire.user.JDBCUserProvider' WHERE `name` = 'provider.user.className';
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.loadUserSQL', 'SELECT name,email FROM account WHERE username=?');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.userCountSQL', 'SELECT COUNT(*) FROM account');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.allUsersSQL', 'SELECT username FROM account');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.searchSQL', 'SELECT username FROM account WHERE');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.usernameField', 'username');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.nameField', 'name');
INSERT INTO `ofproperty` VALUES ('jdbcUserProvider.emailField', 'email');
1. 看效果
ofuser表数据截图
使用内置数据库控制台:
另外项目的account表
修改ofproperty表之后,使用account表作为认证表。重启OpenFire。
控制台
说明:OpenFire控制台只支持admin用户登陆。添加用户的方法还在研究中