- 登录链路改为用户名 + 密码 + 短信验证码 + DCAuth v2 设备签名 - 新增 login_sms_codes / user_devices / device_challenges 三张表,迁移 0063/0064 - 设备绑定只比对 deviceId + publicKey,每账号一个 active 设备,管理员可重置 - 保留未绑定手机号账号的密码登录兜底,绑定后强制安全登录 - 登录页与用户管理页支持验证码、DCAuth 轮询、手机号绑定与设备重置
31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
"""用户信息序列化(列表 / 创建 / 编辑 / 管理端接口共用)。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from ..models import User, UserDevice
|
|
from ..permissions import get_user_permissions
|
|
from ..schemas import UserInfo
|
|
from .dc_auth_service import mask_device_id
|
|
from .login_sms_service import mask_phone
|
|
|
|
|
|
def to_user_info(user: User, device: UserDevice | None = None) -> UserInfo:
|
|
device_id = str(device.device_id or "") if device is not None else ""
|
|
return UserInfo(
|
|
id=user.id,
|
|
username=user.username,
|
|
role=user.role,
|
|
is_active=user.is_active,
|
|
remark=user.remark or "",
|
|
created_at=user.created_at,
|
|
permissions=get_user_permissions(user),
|
|
custom_permissions=user.custom_permissions,
|
|
phone=str(user.phone or ""),
|
|
phone_masked=mask_phone(user.phone),
|
|
phone_bound_at=user.phone_bound_at,
|
|
device_id=device_id,
|
|
device_id_masked=mask_device_id(device_id),
|
|
device_bound_at=device.bound_at if device is not None else None,
|
|
device_last_used_at=device.last_used_at if device is not None else None,
|
|
)
|