feat(huya): 合并外部单协作 CK 权限
This commit is contained in:
@@ -70,8 +70,8 @@ PERMISSIONS = {
|
||||
"huya:collab:view": "查看外部 CK 协作台账",
|
||||
"huya:collab:edit": "编辑外部 CK 协作台账",
|
||||
"huya:collab:manage": "删除外部 CK 协作台账",
|
||||
# CK 是凭据:导到剪贴板 = 把凭据带出系统,单独一个点(同 cookie:export 的口径),默认只给运营
|
||||
"huya:collab:ck_export": "导出外部 CK 协作台账的 CK(写剪贴板)",
|
||||
# CK 是凭据:单行复制与批量导出共用这个权限点,默认运营和客服都有。
|
||||
"huya:collab:ck_export": "复制/导出外部 CK 协作台账的 CK(写剪贴板)",
|
||||
# 代理 & 白名单
|
||||
"proxy:manage": "代理配置管理",
|
||||
"whitelist:manage": "白名单配置管理",
|
||||
@@ -163,8 +163,8 @@ ROLE_PERMISSIONS = {
|
||||
# 客服能看能改(共享表,靠审计留痕),但删除只给运营。
|
||||
"huya:collab:view",
|
||||
"huya:collab:edit",
|
||||
# 注意:**不给** huya:collab:ck_export —— 贴 CK 是「录入」,导出是「把凭据带走」,
|
||||
# 需要时在权限页单独勾(口径同 huya:cookie:export,见设计文档 §11.8)。
|
||||
# 单行复制与批量导出共用权限点,客服默认也可用,仍逐行写审计。
|
||||
"huya:collab:ck_export",
|
||||
"file:view",
|
||||
"file:upload",
|
||||
],
|
||||
|
||||
@@ -30,7 +30,7 @@ from fastapi import (
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ...database import get_db
|
||||
from ...deps import authenticate_websocket, get_current_user, require_permission
|
||||
from ...deps import authenticate_websocket, require_permission
|
||||
from ...models import AuditLog, HuyaExternalOrder, User
|
||||
from ...permissions import get_user_permissions
|
||||
from ...schemas import (
|
||||
@@ -625,9 +625,9 @@ def export_external_orders_ck(
|
||||
):
|
||||
"""勾选多行导出 **CK 明文**(前端写进剪贴板)。
|
||||
|
||||
单独一个权限点 ``huya:collab:ck_export``(默认只给运营):贴 CK 是「录入」,
|
||||
导出是「把凭据带走」。逐行写审计(``huya:collab:ck_export``),但**只记单号**,
|
||||
不把 CK 本体写进审计;没 CK 的行在 ``skipped`` 里显式回原因。
|
||||
与单行复制共用权限点 ``huya:collab:ck_export``,默认运营和客服都有。
|
||||
逐行写审计,但**只记单号**,不把 CK 本体写进审计;
|
||||
没 CK 的行在 ``skipped`` 里显式回原因。
|
||||
"""
|
||||
try:
|
||||
orders = collab.list_orders_by_ids(db, req.ids)
|
||||
@@ -643,16 +643,12 @@ def export_external_orders_ck(
|
||||
def copy_external_order_ck(
|
||||
order_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current: User = Depends(get_current_user),
|
||||
current: User = Depends(require_permission("huya:collab:ck_export")),
|
||||
):
|
||||
"""复制单行 CK 明文(**仅超级管理员**;前端直接写剪贴板)。
|
||||
"""复制单行 CK 明文(由 ``huya:collab:ck_export`` 权限控制)。
|
||||
|
||||
这个入口比勾选导出更敏感:它把「单行凭据」做成一键复制,因此只给管理员。
|
||||
仍然复用 :func:`collab.export_cks`:逐行写 ``huya:collab:ck_export`` 审计,
|
||||
但审计里只记单号,不写 CK 本体。
|
||||
与勾选导出共用同一个权限点和审计动作,审计只记单号,不写 CK 本体。
|
||||
"""
|
||||
if current.role != "super_admin":
|
||||
raise HTTPException(status_code=403, detail="仅超级管理员可复制 CK")
|
||||
try:
|
||||
order = collab.get_order(db, order_id)
|
||||
return collab.export_cks(db, current, [order])
|
||||
|
||||
@@ -2506,8 +2506,8 @@ def export_cks(
|
||||
|
||||
这是本模块唯一一个把凭据**往外送**的读接口,所以三条约束写死在这里:
|
||||
|
||||
1. **权限单独一个点**(``huya:collab:ck_export``,默认只给运营)—— 贴 CK 是「录入」,
|
||||
导出是「把凭据带走」,两件事不该共用一个权限(口径同 ``huya:cookie:export``);
|
||||
1. **单行复制与批量导出共用一个权限点** ``huya:collab:ck_export``,
|
||||
默认给运营和客服;权限页的自定义权限仍可覆盖;
|
||||
2. **逐行写审计**(``huya:collab:ck_export``):只记「谁在什么时候导出了哪一单」,
|
||||
**绝不把 CK 本体写进审计/日志**(列表接口也照旧不返回 cookie);
|
||||
3. **没 CK 的行显式跳过并回原因**,不静默丢;也不替用户猜 ——
|
||||
|
||||
@@ -345,7 +345,7 @@ export const huyaApi = {
|
||||
'/huya/external-orders/ck/export',
|
||||
{ ids },
|
||||
),
|
||||
/** 单行复制 CK(仅超级管理员;后端再次校验角色) */
|
||||
/** 单行复制 CK(与批量导出共用 huya:collab:ck_export 权限) */
|
||||
copyCollabOrderCk: (id: number) =>
|
||||
api.post<HuyaCollabCkExportResult, HuyaCollabCkExportResult>(
|
||||
`/huya/external-orders/${id}/ck/copy`,
|
||||
|
||||
@@ -501,10 +501,8 @@ export default function HuyaCollabPage() {
|
||||
const { can, user } = usePermissions();
|
||||
const canEdit = can('huya:collab:edit');
|
||||
const canManage = can('huya:collab:manage');
|
||||
// 导出 CK 是把凭据带出系统,单独一个权限点(默认只给运营,见 permissions.py)
|
||||
// 单行复制与批量导出共用这个权限点(默认运营和客服都有)
|
||||
const canExportCk = can('huya:collab:ck_export');
|
||||
// 「复制 CK」是单行一键带走凭据,按用户要求只给超级管理员(后端也会再校验一次)
|
||||
const isAdmin = user?.role === 'super_admin';
|
||||
|
||||
const [rows, setRows] = useState<HuyaCollabOrder[]>([]);
|
||||
const [total, setTotal] = useState(0);
|
||||
@@ -1399,7 +1397,7 @@ export default function HuyaCollabPage() {
|
||||
}
|
||||
};
|
||||
|
||||
/** 单行「复制 CK」:只有超级管理员能看到按钮,后端还会再校验一次角色。 */
|
||||
/** 单行「复制 CK」与批量导出共用权限点,后端会再次校验。 */
|
||||
const copyOneCk = async (row: HuyaCollabOrder) => {
|
||||
setBusy(true);
|
||||
try {
|
||||
@@ -2249,8 +2247,8 @@ export default function HuyaCollabPage() {
|
||||
补资料
|
||||
</Button>
|
||||
)}
|
||||
{isAdmin && !row.is_archived && (
|
||||
<Tooltip title={row.has_cookie ? '复制这一行的 CK 明文(仅管理员)' : '这行还没贴 CK'}>
|
||||
{canExportCk && !row.is_archived && (
|
||||
<Tooltip title={row.has_cookie ? '复制这一行的 CK 明文' : '这行还没贴 CK'}>
|
||||
<Button size="small" icon={<CopyOutlined />}
|
||||
disabled={busy || !row.has_cookie}
|
||||
onClick={() => void copyOneCk(row)}>
|
||||
|
||||
Reference in New Issue
Block a user