fix: 超管跨部门放行 —— 修正登录部门过滤过严
原实现把所有账号一律收敛到 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 主管)-> 仍拒
This commit is contained in:
@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user