diff --git a/server/app/adminapi/controller/DesktopController.php b/server/app/adminapi/controller/DesktopController.php new file mode 100644 index 000000000..7f06d9d00 --- /dev/null +++ b/server/app/adminapi/controller/DesktopController.php @@ -0,0 +1,55 @@ +request->adminInfo ?? []); + if (empty($identity) || empty($identity['admin_id'])) { + return $this->fail('登录已失效,请重新登录'); + } + if ((int)($identity['terminal'] ?? 0) !== AdminTerminalEnum::WECOM_RPA) { + return $this->fail('当前登录令牌不属于企业微信客服桌面端'); + } + + $admin = Admin::where(['id' => (int)$identity['admin_id']]) + ->field('id,account,name,avatar,disable') + ->findOrEmpty(); + if ($admin->isEmpty() || (int)$admin['disable'] === YesNoEnum::YES) { + return $this->fail('管理员不存在或已禁用'); + } + + $account = trim((string)$admin['account']); + $name = trim((string)$admin['name']); + return $this->data([ + // 加类型前缀,避免管理员 id 与普通用户 id 相同时落到同一个客服租户。 + 'user_id' => 'admin:' . (int)$admin['id'], + 'sn' => $account, + 'nickname' => $name !== '' ? $name : $account, + 'mobile' => '', + 'avatar' => (string)$admin['avatar'], + 'terminal' => AdminTerminalEnum::WECOM_RPA, + 'expire_time' => (int)($identity['expire_time'] ?? 0), + 'status' => 'active', + 'account_type' => 'admin', + ]); + } +} diff --git a/server/app/adminapi/validate/LoginValidate.php b/server/app/adminapi/validate/LoginValidate.php index 0cf405f77..a1d18d624 100755 --- a/server/app/adminapi/validate/LoginValidate.php +++ b/server/app/adminapi/validate/LoginValidate.php @@ -32,7 +32,8 @@ use think\facade\Log; class LoginValidate extends BaseValidate { protected $rule = [ - 'terminal' => 'require|in:' . AdminTerminalEnum::PC . ',' . AdminTerminalEnum::MOBILE, + 'terminal' => 'require|in:' . AdminTerminalEnum::PC . ',' . AdminTerminalEnum::MOBILE + . ',' . AdminTerminalEnum::WECOM_RPA, 'account' => 'require', 'password' => 'require|password', ]; @@ -143,4 +144,4 @@ class LoginValidate extends BaseValidate return in_array($flag, ['1', 'true', 'yes', 'on'], true); } -} \ No newline at end of file +} diff --git a/server/app/common/enum/AdminTerminalEnum.php b/server/app/common/enum/AdminTerminalEnum.php index e3dac5da5..63585a9dd 100755 --- a/server/app/common/enum/AdminTerminalEnum.php +++ b/server/app/common/enum/AdminTerminalEnum.php @@ -25,4 +25,6 @@ class AdminTerminalEnum { const PC = 1; const MOBILE = 2; -} \ No newline at end of file + // 企业微信客服桌面软件。与网页端分开保存会话,桌面登录不会顶掉浏览器登录。 + const WECOM_RPA = 7; +} diff --git a/server/tests/AdminDesktopAuthContractTest.php b/server/tests/AdminDesktopAuthContractTest.php new file mode 100644 index 000000000..3b16d8641 --- /dev/null +++ b/server/tests/AdminDesktopAuthContractTest.php @@ -0,0 +1,33 @@ + 'admin:'") + && str_contains($controller, "'account_type' => 'admin'"), + 'desktop session verifies an admin token and namespaces its tenant identity' +); + +echo "OK\n";