134
#pragma hdrstop
#include "udmServer.h"
#include "udssmRemoteData.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TdmServer *dmServer;
//---------------------------------------------------------------------------
__fastcall TdmServer::TdmServer(TComponent* Owner)
: TDataModule(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TdmServer::DSServerClassGetClass(TDSServerClass *DSServerClass,
TPersistentClass &PersistentClass)
{
// Определяем серверный класс
PersistentClass = __classid(TdssmRemoteData);
}
//---------------------------------------------------------------------------
void __fastcall TdmServer::DSAuthenticationManagerUserAuthenticate(TObject *Sender,
const UnicodeString Protocol, const UnicodeString Context, const
UnicodeString User,
const UnicodeString Password, bool &valid, TStrings *UserRoles)
{
// valid - флаг, определяющий, разрешить пользователю вход на сервер или
запретить;
// в нашем случае он определяется исходя из того, найден ли пользователь в БД
// по логину и паролю или нет.
valid = false;
// Блокировка пользователя;
bool Blocked = false;
// Тип пользователя;
int UserTypeKey;
// Код пользователя;
int UserKey = GetUserKey (User, Password, Blocked, UserTypeKey);
// Определяем, "впускать ли пользователя в систему, или нет"
valid = UserKey > 0;
// Если блокировка установлена, то выбрасываем исключение;
if (Blocked == true) throw new Exception ("Вход в систему невозможен. Ваш аккаунт
заблокирован.");
// Если валидация не установлена, то выбрасываем исключение;
if (valid == false) throw new Exception ("Неверная пара логин/пароль.");
// Если все проверки пройдены, ищем соответствующий элемент списка,
// который связан идентификатором текущего потока (ThreadId);
TConnectionInfo *CI = ConnectionList->GetConnectionKey (GetCurrentThreadId());
// Записываем "код пользователя";
CI->UserKey = UserKey;
// Записываем "тип пользователя";