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.mom_database import MomSessionLocal
|
||||||
from app.core.logging import user_var
|
from app.core.logging import user_var
|
||||||
|
from app.core.roles import SUPER_ADMIN
|
||||||
from app.schemas.user import LoginResponse, UserResponse
|
from app.schemas.user import LoginResponse, UserResponse
|
||||||
|
|
||||||
security = HTTPBearer()
|
security = HTTPBearer()
|
||||||
@ -24,9 +25,14 @@ def login(username: str, password: str) -> LoginResponse:
|
|||||||
"""登录 — 签发双 Token(Access + Refresh)"""
|
"""登录 — 签发双 Token(Access + Refresh)"""
|
||||||
db = MomSessionLocal()
|
db = MomSessionLocal()
|
||||||
try:
|
try:
|
||||||
# 1. 普通用户:LIKE '%/username' 模糊匹配 MOM sys_user 表
|
# 1. LIKE '%/username' 定位 MOM sys_user 账号,再按部门收敛 ——
|
||||||
# 并且只允许本部门(settings.ORG_DEPARTMENT)的人登录 —— IRIS 与 LICA
|
# IRIS 与 LICA 共用同一个 MOM 库,不加部门条件的话,另一个部门的
|
||||||
# 共用同一个 MOM 库,这里不加部门条件的话,另一个部门的人也能登进来。
|
# 普通账号也能登进来。
|
||||||
|
#
|
||||||
|
# ⚠️ 唯一的例外是 SUPER_ADMIN:超管**跨部门放行**,供运维/管理员在
|
||||||
|
# 两个实例之间切换。其余角色(INBOUND / SUPERVISOR / WAREHOUSE_MGR /
|
||||||
|
# SALES)必须严格属于本部门(settings.ORG_DEPARTMENT)。
|
||||||
|
#
|
||||||
# 不匹配时统一报「用户名或密码错误」,不区分「账号不存在」与「存在但
|
# 不匹配时统一报「用户名或密码错误」,不区分「账号不存在」与「存在但
|
||||||
# 不属于本部门」,避免给账号探测者提供线索。
|
# 不属于本部门」,避免给账号探测者提供线索。
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
@ -35,9 +41,13 @@ def login(username: str, password: str) -> LoginResponse:
|
|||||||
"SELECT id, username, department, role, password_hash "
|
"SELECT id, username, department, role, password_hash "
|
||||||
"FROM sys_user "
|
"FROM sys_user "
|
||||||
"WHERE username LIKE :pattern "
|
"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()
|
row = result.fetchone()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user