实现多终端登录限制与强制断开功能
开发框架:Delphi
核心功能:实现同一账号多设备登录管控及强制断开操作
1. 采用全局临时表记录当前登录状态。创建临时表结构CREATE TABLE #TempUserTable (SessionID int);其中#TempUserTable为表名,SessionID表示会话标识。
function TLoginModule.CheckUserLoginStatus(Conn: TADOConnection; UserID: string): Boolean;
var
Query: TADOQuery;
strSQL: string;
begin
try
Query := TADOQuery.Create(Conn);
try
strSQL := Format('SELECT OBJECT_ID(N''tempdb..#%s'', N''U'') AS TableID', [UserID]);
Query.SQL.Text := strSQL;
Query.Open;
Result := not Query.FieldByName('TableID').IsNull;
finally
Query.Free;
end;
except
Result := False;
end;
end;
2. 用户信息表新增登录状态字段"LoginStatus",默认值为0(离线)。登录成功时创建临时表并更新状态为1。
function TLoginModule.RegisterUserLogin(Conn: TADOConnection; UserID: string): Boolean;
var
Query, CommQuery: TADOQuery;
strSQL: string;
begin
try
Query := TADOQuery.Create(Conn);
CommQuery := TADOQuery.Create(Conn);
try
strSQL := Format('CREATE TABLE #%s(SessionID int);', [UserID]);
Query.SQL.Text := strSQL;
Query.ExecSQL;
strSQL := Format('UPDATE UserAccounts SET LoginStatus=1 WHERE UserId=%S', [QuotedStr(UserID)]);
CommQuery.SQL.Text := strSQL;
CommQuery.ExecSQL;
finally
Query.Free;
CommQuery.Free;
end;
except
Result := False;
end;
Result := True;
end;
3. 登录验证逻辑处理:
if not CheckUserLoginStatus(adocWMS, CurrentUserID) then
begin
if GetLoginStatus(adocCommon, CurrentUserID) then
UpdateLoginStatus(adocCommon, CurrentUserID, 0);
RegisterUserLogin(adocWMS, CurrentUserID);
end else begin
if MessageBox(Handle, '检测到其他设备登录,是否强制接管?', '系统提示', MB_YESNO) = IDYES then
begin
UpdateLoginStatus(adocCommon, CurrentUserID, 0);
while CheckUserLoginStatus(adocWMS, CurrentUserID) do
Sleep(1000);
RegisterUserLogin(adocWMS, CurrentUserID);
end;
end;
4. 强制断开监控机制:
procedure TLoginModule.TimerMonitorTimer(Sender: TObject);
const
WTS_CURRENT_SERVER_HANDLE = 0;
var
SessionID: DWORD;
Message: string;
begin
if CheckUserLoginStatus(adocCommon, Parameter[4]) and not GetLoginStatus(adocCommon, Parameter[4]) then
begin
TimerMonitor.Enabled := False;
Message := '检测到其他终端登录,您已被强制下线';
WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTSGetActiveConsoleSessionId,
PChar('系统提示'), Length('系统提示'),
PChar(Message), Length(Message),
MB_OK, 0, 0, False);
TerminateProcess(GetCurrentProcess, 0);
end;
end;
5. 状态管理辅助函数:
function TLoginModule.GetLoginStatus(Conn: TADOConnection; UserID: string): Boolean;
var
Query: TADOQuery;
begin
Result := False;
Query := TADOQuery.Create(Conn);
try
Query.SQL.Text := Format('SELECT LoginStatus FROM UserAccounts WHERE UserId=%S', [QuotedStr(UserID)]);
Query.Open;
Result := Query.FieldByName('LoginStatus').AsInteger = 1;
finally
Query.Free;
end;
end;
function TLoginModule.UpdateLoginStatus(Conn: TADOConnection; UserID: string; Status: Integer): Boolean;
var
Query: TADOQuery;
begin
Query := TADOQuery.Create(Conn);
try
Query.SQL.Text := Format('UPDATE UserAccounts SET LoginStatus=%d WHERE UserId=%S', [Status, QuotedStr(UserID)]);
Query.ExecSQL;
finally
Query.Free;
end;
Result := True;
end;