This commit is contained in:
gr
2026-09-30 14:35:46 +08:00
parent 3cdc812f2b
commit 5543f45850
3 changed files with 152 additions and 1 deletions
@@ -21,6 +21,7 @@ use app\common\service\pharmacy\PharmacyUploadPermissionAlias;
use app\common\service\qywx\QywxPromotionOperatorAccess;
use app\common\{
cache\AdminAuthCache,
enum\AdminTerminalEnum,
service\JsonService
};
use think\helper\Str;
@@ -47,7 +48,13 @@ class AuthMiddleware
return $next($request);
}
if ($request->adminInfo['login_ip'] != request()->ip()) {
// 登录 IP 绑定;客服后台服务器代查患者/订单的例外见 isTrustedRpaServerRequest
if ($request->adminInfo['login_ip'] != request()->ip()
&& !self::isTrustedRpaServerRequest(
(array) $request->adminInfo,
request()->ip(),
env('wecom_rpa.server_ips', '')
)) {
return JsonService::fail('ip地址发生变化,请重新登录', [], -1);
}
@@ -122,6 +129,29 @@ class AuthMiddleware
}, $data);
}
/**
* 企业微信客服桌面软件(7)/ 手机控制台(9)的令牌会交给客服后台,由客服后台服务器
* 代查患者、订单;服务器出口 IP 与员工电脑登录时绑定的 IP 不同,按原规则每次都会被判为
* 「ip地址发生变化」。DesktopController::session 出于同一原因已免登录。
* 这里只在「RPA 终端令牌 + 请求来自 .env [WECOM_RPA] SERVER_IPS 配置的客服后台服务器 IP」
* 时跳过 IP 绑定,网页端/APP 等其他终端令牌仍保留 IP 保护;未配置时与原逻辑完全一致。
* 只跳过 IP 校验,后续菜单权限校验照常执行,客服后台拿到的仍只是该账号角色允许的数据。
*
* @param mixed $configured 逗号/空白分隔的 IP 列表,逐个精确匹配(IPv4/IPv6 字面量)
*/
public static function isTrustedRpaServerRequest(array $adminInfo, string $ip, $configured): bool
{
if (!in_array((int) ($adminInfo['terminal'] ?? 0), AdminTerminalEnum::wecomRpaTerminals(), true)) {
return false;
}
if ($ip === '' || !is_string($configured)) {
return false;
}
$trustedIps = preg_split('/[\s,]+/', trim($configured), -1, PREG_SPLIT_NO_EMPTY) ?: [];
return in_array($ip, $trustedIps, true);
}
/**
* 日常记录权限域:前端统一收口到 tcm.diagnosis/dailyRecord,
* 但待办/跟踪备注接口仍保留历史路由名,故在鉴权层做精确别名映射。