From a2940d265d616938d282528686af816148bbef08 Mon Sep 17 00:00:00 2001 From: duxingchen Date: Mon, 21 Sep 2026 16:17:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B6=85=E7=AE=A1=E8=B7=A8=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=94=BE=E8=A1=8C=20=E2=80=94=E2=80=94=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E7=99=BB=E5=BD=95=E9=83=A8=E9=97=A8=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E8=BF=87=E4=B8=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原实现把所有账号一律收敛到 department = ORG_DEPARTMENT,导致 IRIS 的 超级管理员登不进 LICA 实例。需求本意是「超管不拦截,其余角色只能本部门 登录」,实现时把超管的豁免一起去掉了。 改为: WHERE username LIKE :pattern AND (department = :dept OR role = 'SUPER_ADMIN') role 取自 app/core/roles.py::SUPER_ADMIN,不新增硬编码字符串。 已用 MOM 真实数据验证: duxingchen / zhuxiangning(IRIS 超管) -> 放行 xingyouwu / sunxia(LICA 超管) -> 放行 weihuijun(LICA 普通)、gaoxue(LICA 主管) -> 放行 zhangxinxin(IRIS 普通)、renlixin(IRIS 主管)-> 仍拒 --- backend/app/services/auth_service.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py index 1e8efba..c9995c3 100644 --- a/backend/app/services/auth_service.py +++ b/backend/app/services/auth_service.py @@ -15,6 +15,7 @@ from app.core.security import ( ) from app.core.mom_database import MomSessionLocal from app.core.logging import user_var +from app.core.roles import SUPER_ADMIN from app.schemas.user import LoginResponse, UserResponse security = HTTPBearer() @@ -24,9 +25,14 @@ def login(username: str, password: str) -> LoginResponse: """登录 — 签发双 Token(Access + Refresh)""" db = MomSessionLocal() try: - # 1. 普通用户:LIKE '%/username' 模糊匹配 MOM sys_user 表 - # 并且只允许本部门(settings.ORG_DEPARTMENT)的人登录 —— IRIS 与 LICA - # 共用同一个 MOM 库,这里不加部门条件的话,另一个部门的人也能登进来。 + # 1. LIKE '%/username' 定位 MOM sys_user 账号,再按部门收敛 —— + # IRIS 与 LICA 共用同一个 MOM 库,不加部门条件的话,另一个部门的 + # 普通账号也能登进来。 + # + # ⚠️ 唯一的例外是 SUPER_ADMIN:超管**跨部门放行**,供运维/管理员在 + # 两个实例之间切换。其余角色(INBOUND / SUPERVISOR / WAREHOUSE_MGR / + # SALES)必须严格属于本部门(settings.ORG_DEPARTMENT)。 + # # 不匹配时统一报「用户名或密码错误」,不区分「账号不存在」与「存在但 # 不属于本部门」,避免给账号探测者提供线索。 from sqlalchemy import text @@ -35,9 +41,13 @@ def login(username: str, password: str) -> LoginResponse: "SELECT id, username, department, role, password_hash " "FROM sys_user " "WHERE username LIKE :pattern " - " AND department = :dept" + " AND (department = :dept OR role = :super_admin)" ), - {"pattern": f"%/{username}", "dept": settings.ORG_DEPARTMENT}, + { + "pattern": f"%/{username}", + "dept": settings.ORG_DEPARTMENT, + "super_admin": SUPER_ADMIN, + }, ) row = result.fetchone()