Итак, на самом деле не так сложно заставить это работать.Вам нужно создать три новых файла Java, по одному для каждого из следующих:
- Один, который реализует AdminProvider.java (если вы хотите получить администраторов из базы данных IIS)
- Одинкоторый реализует UserProvider.java (для вывода списка всех / активных пользователей из IIS)
- Тот, который реализует AuthProvider.java (для фактического выполнения аутентификации)
Реализация администратора admin и пользователяПоставщик прост, просто следуйте приведенным примерам JDBC.Следует отметить, что база данных IIS отключена от некоторого идентификатора GUID, а фактические поля учетной записи пользователя (электронная почта, имя и т. Д.) Находятся в другой таблице, поэтому вам необходимо выполнить запрос, чтобы выяснить идентификатор IIS, затем используйте это, чтобы выяснить остальные поля учетной записи, то есть.
SELECT TOP 1 UserId FROM dbo.aspnet_Users WHERE LoweredUserName = ?
Затем, чтобы получить E-mail (после того, как у вас есть IIS ID)
SELECT TOP 1 Email FROM dbo.aspnet_Membership WHERE UserId = ?
Выполнить настоящую аутентификацию очень просто, просто возьмите имя пользователя, данное вам openfire, очистите его (иногда это user @ host - часть @host на самом деле не является частьюusername) и выясните 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Поле пароля abase, и вы будете в нерабочем состоянии.
Еще одна вещь, которую следует отметить с провайдером Admin: AdminManager, который использует openfire, кэширует результаты.Похоже, что результаты загружаются в кеш при запуске системы, поэтому невозможно синхронизировать список администраторов с 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, и это очень легко.Обратите внимание, что после изменения свойств provider.*
в конфигурации openfire вы больше не сможете войти в систему с администратором по умолчанию - если что-то не так, вам придется вернуться в базу данных и изменить конфигурацию (втаблица dbo.ofProperty
вашей базы данных openfire.)