所以,让它发挥作用实际上并不难。您需要创建三个新的 Java 文件,一个用于以下各项:
- 一个实现 AdminProvider.java(如果您想从 IIS 数据库中提取管理员)
- 一个实现 UserProvider.java(列出来自 IIS 的所有/活动用户)的工具
- 实现 AuthProvider.java(实际进行身份验证)的一种
实现 admin provdier 和 user provider 很简单,只需按照提供的 JDBC 示例进行操作即可。需要注意的一件事是 IIS 数据库与某些 GUID 无关,而实际的用户帐户字段(电子邮件、姓名等)位于不同的表中,因此您必须进行查询才能确定 IIS ID ,然后用它来计算其余的帐户字段,即。
SELECT TOP 1 UserId FROM dbo.aspnet_Users WHERE LoweredUserName = ?
然后获取电子邮件(在您拥有 IIS ID 之后)
SELECT TOP 1 Email FROM dbo.aspnet_Membership WHERE UserId = ?
进行实际的身份验证非常简单,只需获取 openfire 给您的用户名,清理它(有时是 user@host -- @host 部分并不是用户名的一部分)并找出 IIS ID根据您提供的用户名。
然后你可以查询密码和密码哈希
SELECT TOP 1 Password, PasswordSalt FROM dbo.aspnet_Membership WHERE UserId = ?
这样你就拥有了加密给你的密码所需的一切——算法如下:
注意——所有实用程序都包含在 OpenFire 中(即decodeHex(...)、Base64...)
private static String encryptPassword(String password, String salt)
{
if(password == null || salt == null)
return "";
try
{
byte[] bytes = password.getBytes("UTF-16LE");
byte[] src = Base64.decode(salt);
byte[] dst = new byte[src.length + bytes.length];
System.arraycopy(src, 0, dst, 0, src.length);
System.arraycopy(bytes, 0, dst, src.length, bytes.length);
// Calculate the SHA1
byte[] hashed = StringUtils.decodeHex(StringUtils.hash(dst, "SHA-1"));
return Base64.encodeBytes(hashed);
}
catch (UnsupportedEncodingException e)
{
Log.error("UTF-16LE encoding not suported");
}
return "";
}
只需将此函数的结果与 IIS 数据库的密码字段进行比较,您就可以开始运行了。
另一个需要注意的 Admin 提供者:openfire 使用的 AdminManager 缓存结果。看起来结果在系统启动时被缓存了——所以实际上不可能使管理员列表与 IIS 保持同步。我仍在考虑那个,以找出最好的方法是什么。我可能会一起删除缓存(AdminManager 只是在内存中保存管理员列表。)
完成所有设置后,只需更改配置中的一些属性,以便 openfire 将其连接到您的解决方案,例如。
provider.admin.className --> org.jivesoftware.openfire.admin.IISAdminProvider
provider.auth.className --> org.jivesoftware.openfire.auth.IISAuthProvider
provider.user.className --> org.jivesoftware.openfire.user.IISUserProvider
我为 IIS 数据库用户名/密码添加了一些属性,还为我的管理员组的名称添加了一些变量,等等。只需按照 JDBC 示例进行操作,这很容易。请注意,在您更改 openfire 配置中的 provider.* 属性后,您将无法再使用默认管理员登录 - 如果出现问题,您将不得不返回数据库并更改配置(在您的 openfire DB 的 dbo.ofProperty 表。)