当前位置:首页 > 技术 > 正文内容

实现多终端登录限制与强制断开功能

访客 技术 2026年7月24日 1

开发框架: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;

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。