security: 补全剩余端点鉴权 + 移除硬编码管理员后门
1. 鉴权补全 - orders.py: create_order 补全 Depends(get_current_user) - print.py: print_execute 和 update_printer_config 补全鉴权 - records.py: update_record 和 delete_record 补全鉴权 2. 安全加固 - auth_service.py: 移除硬编码超级管理员(IRIS/123321)后门 - 所有用户统一通过MOM sys_user scrypt密码验证登录
This commit is contained in:
@ -9,6 +9,7 @@ from sqlalchemy.orm import selectinload
|
|||||||
from app.core.database import get_db
|
from app.core.database import get_db
|
||||||
from app.models.production_order import ProductionOrder
|
from app.models.production_order import ProductionOrder
|
||||||
from app.schemas.order import OrderCreate, OrderResponse
|
from app.schemas.order import OrderCreate, OrderResponse
|
||||||
|
from app.services.auth_service import get_current_user
|
||||||
|
|
||||||
router = APIRouter(prefix="/orders", tags=["订单管理"])
|
router = APIRouter(prefix="/orders", tags=["订单管理"])
|
||||||
|
|
||||||
@ -27,7 +28,11 @@ async def list_orders(
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/", response_model=OrderResponse, status_code=201)
|
@router.post("/", response_model=OrderResponse, status_code=201)
|
||||||
async def create_order(data: OrderCreate, db: AsyncSession = Depends(get_db)):
|
async def create_order(
|
||||||
|
data: OrderCreate,
|
||||||
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
|
):
|
||||||
order = ProductionOrder(**data.model_dump())
|
order = ProductionOrder(**data.model_dump())
|
||||||
db.add(order)
|
db.add(order)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
"""标签打印 API — 预览 / 执行 / 打印机配置"""
|
"""标签打印 API — 预览 / 执行 / 打印机配置"""
|
||||||
from fastapi import APIRouter, HTTPException, status
|
from fastapi import APIRouter, Depends, HTTPException, status
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from app.services.label_service import generate_preview_image, send_to_printer
|
from app.services.label_service import generate_preview_image, send_to_printer
|
||||||
from app.services.print_config import PrintConfigManager
|
from app.services.print_config import PrintConfigManager
|
||||||
|
from app.services.auth_service import get_current_user
|
||||||
|
|
||||||
router = APIRouter(prefix="/print", tags=["标签打印"])
|
router = APIRouter(prefix="/print", tags=["标签打印"])
|
||||||
|
|
||||||
@ -49,7 +50,10 @@ def print_preview(data: LabelPreviewRequest) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/execute")
|
@router.post("/execute")
|
||||||
def print_execute(data: PrintExecuteRequest) -> dict:
|
def print_execute(
|
||||||
|
data: PrintExecuteRequest,
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
|
) -> dict:
|
||||||
"""发送打印指令到物理打标机"""
|
"""发送打印指令到物理打标机"""
|
||||||
payload = data.model_dump()
|
payload = data.model_dump()
|
||||||
copies = payload.pop("copies", 1)
|
copies = payload.pop("copies", 1)
|
||||||
@ -77,7 +81,10 @@ def get_printer_config() -> dict:
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/config")
|
@router.post("/config")
|
||||||
def update_printer_config(data: PrinterConfigUpdate) -> dict:
|
def update_printer_config(
|
||||||
|
data: PrinterConfigUpdate,
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
|
) -> dict:
|
||||||
"""更新打印机配置(IP/端口)"""
|
"""更新打印机配置(IP/端口)"""
|
||||||
current = PrintConfigManager.get_config()
|
current = PrintConfigManager.get_config()
|
||||||
current["label_printer"] = {
|
current["label_printer"] = {
|
||||||
|
|||||||
@ -8,6 +8,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||||||
from app.core.database import get_db
|
from app.core.database import get_db
|
||||||
from app.models.task import TaskRecord
|
from app.models.task import TaskRecord
|
||||||
from app.schemas.task import TaskRecordCreate, TaskRecordResponse
|
from app.schemas.task import TaskRecordCreate, TaskRecordResponse
|
||||||
|
from app.services.auth_service import get_current_user
|
||||||
|
|
||||||
router = APIRouter(prefix="/records", tags=["任务记录"])
|
router = APIRouter(prefix="/records", tags=["任务记录"])
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ async def update_record(
|
|||||||
record_id: int,
|
record_id: int,
|
||||||
data: TaskRecordCreate,
|
data: TaskRecordCreate,
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
):
|
):
|
||||||
"""更新任务记录(备注+图片)"""
|
"""更新任务记录(备注+图片)"""
|
||||||
record = await _get_record_or_404(db, record_id)
|
record = await _get_record_or_404(db, record_id)
|
||||||
@ -40,6 +42,7 @@ async def update_record(
|
|||||||
async def delete_record(
|
async def delete_record(
|
||||||
record_id: int,
|
record_id: int,
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
):
|
):
|
||||||
"""删除任务记录"""
|
"""删除任务记录"""
|
||||||
record = await _get_record_or_404(db, record_id)
|
record = await _get_record_or_404(db, record_id)
|
||||||
|
|||||||
@ -23,21 +23,7 @@ def login(username: str, password: str) -> LoginResponse:
|
|||||||
"""登录 — 签发双 Token(Access + Refresh)"""
|
"""登录 — 签发双 Token(Access + Refresh)"""
|
||||||
db = MomSessionLocal()
|
db = MomSessionLocal()
|
||||||
try:
|
try:
|
||||||
# 1. 超级管理员硬编码(和 MOM 系统一致)
|
# 1. 普通用户:LIKE '%/username' 模糊匹配 MOM sys_user 表
|
||||||
if username == "IRIS" and password == "123321":
|
|
||||||
token_data = {"sub": "0", "role": "SUPER_ADMIN", "username": "IRIS", "display_name": "超级管理员"}
|
|
||||||
return LoginResponse(
|
|
||||||
access_token=create_access_token(data=token_data),
|
|
||||||
refresh_token=create_refresh_token(data=token_data),
|
|
||||||
user=UserResponse(
|
|
||||||
id="0",
|
|
||||||
username="IRIS",
|
|
||||||
display_name="超级管理员",
|
|
||||||
role="SUPER_ADMIN",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
# 2. 普通用户:LIKE '%/username' 模糊匹配 MOM sys_user 表
|
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
result = db.execute(
|
result = db.execute(
|
||||||
text(
|
text(
|
||||||
@ -57,14 +43,14 @@ def login(username: str, password: str) -> LoginResponse:
|
|||||||
|
|
||||||
user_id, full_username, department, role, password_hash = row
|
user_id, full_username, department, role, password_hash = row
|
||||||
|
|
||||||
# 3. Werkzeug scrypt 密码验证
|
# 2. Werkzeug scrypt 密码验证
|
||||||
if not check_password_hash(password_hash, password):
|
if not check_password_hash(password_hash, password):
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||||
detail="用户名或密码错误",
|
detail="用户名或密码错误",
|
||||||
)
|
)
|
||||||
|
|
||||||
# 4. 解析 display_name("张三/zhangsan01" → "张三")
|
# 3. 解析 display_name("张三/zhangsan01" → "张三")
|
||||||
display_name = full_username.split("/")[0] if "/" in full_username else full_username
|
display_name = full_username.split("/")[0] if "/" in full_username else full_username
|
||||||
|
|
||||||
token_data = {
|
token_data = {
|
||||||
|
|||||||
Reference in New Issue
Block a user