Обратные вызовы DataSnap с аутентификацией

Я могу использовать "Обратные вызовы" между сервером datasnap и клиентами, приведенными в качестве примера здесь Павлом Гловаки. Но когда я добавляю DSAuthenticationManager1 в форму сервера с простой аутентификацией, то на стороне клиента я не могу зарегистрировать обратные вызовы.

Я получаю эту ошибку: "Исключительный класс TDBXError с сообщением" Удаленная ошибка: диспетчер аутентификации отклонил учетные данные пользователя. Это может быть связано с неправильной комбинацией имени пользователя и пароля DS "."

Я добавил данные для входа в SQLConnection на клиенте следующим образом:

SQLConnection1.Params.Values['DSAuthenticationUser'] :=  Username;
SQLConnection1.Params.Values['DSAuthenticationPassword'] := Password;

Таким образом, мой SQLConnection1 успешно подключается к серверу. Но я не могу найти какой-либо способ для DSAuthenticationManager1.

Как я могу импортировать параметры входа в DSAuthenticationManager1?

1 ответ

Решение

TDSClientCallbackChannelManager Компонент в Delphi-XE не включает в себя те же свойства, что и в Delphi-XE2. Когда я добавляю этот компонент в свой проект (XE2), у меня Username а также Password свойства, которые передаются серверу DataSnap DSAuthenticationManager.OnUserAuthenticate метод всякий раз, когда RegisterCallback() или же UnregisterCallback() называются.

У вас есть последнее обновление XE? Если имя пользователя и пароль отсутствуют в последнем обновлении, вам, вероятно, потребуется обновить систему до XE2, чтобы использовать TDSAuthenticationManager в сервере DataSnap и TDSClientCallbackChannelManager в клиенте.

Я думал, что, возможно, вы могли бы создать свой собственный класс из TSDClientCallbackChannelManager и переопределите методы, которые добавляют имя пользователя и пароль к DBXConnection, что дает вам возможность добавить их самостоятельно. Я пробовал это, но методы, которые должны быть переопределены, не являются virtual, Я подумал, что, возможно, смогу скрыть методы-предки, продвигая методы с такими же именами в моем новом классе, как publicтогда как они были protected в классе предков. Он генерировал код и связывал его с моим клиентским приложением (это видно по синим точкам рядом с новыми строками кода), но он не вызывал мой код во время выполнения. Вместо этого он всегда вызывал методы предка (DBXConnectionProperties а также ExecuteRemote).

Я думаю, что ваше единственное решение - либо обновить XE2, либо не использовать диспетчер аутентификации на сервере.

Другие вопросы по тегам