Files
rag/knowledge/permission.py
lacerate551 100d1a06eb init: RAG 知识库服务初始提交
- 后端 API(Flask + Gunicorn)
- RAG 引擎(混合检索 + 云端 Reranker + 引用溯源)
- 文档解析(MinerU + 多格式支持)
- Docker 生产部署配置
- 排除前端项目、敏感配置、模型文件
2026-06-04 17:35:27 +08:00

120 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
知识库管理器 - 权限管理 Mixin
提供基于角色和部门的向量库访问控制功能。
权限模型:
- admin: 可访问所有向量库,拥有所有操作权限
- manager: 可访问公开库和本部门库,拥有读写权限
- user: 可访问公开库和本部门库,仅有只读权限
向量库命名规则:
- public_kb: 公开知识库,所有人可读
- dept_{部门名}: 部门知识库,仅对应部门可访问
主要方法:
- get_accessible_collections: 获取用户可访问的向量库列表
- check_permission: 检查用户对指定向量库的操作权限
"""
import logging
from typing import List
from .base import PUBLIC_KB_NAME, normalize_department_name
logger = logging.getLogger(__name__)
class PermissionMixin:
"""
权限管理 Mixin
提供向量库级别的访问控制,基于用户角色和部门判断权限。
依赖属性(需由主类提供):
- self._metadata: 元数据字典(包含 collections 信息)
"""
def get_accessible_collections(
self,
role: str,
department: str,
operation: str = "read"
) -> List[str]:
"""
获取用户可访问的向量库列表
根据用户角色和部门,返回其有权限访问的向量库名称列表。
权限规则:
- admin: 可访问所有向量库
- manager: 可读公开库 + 本部门库,可写本部门库
- user: 仅可读公开库 + 本部门库
Args:
role: 用户角色,可选值: 'admin' | 'manager' | 'user'
department: 用户部门(支持中文名如"财务部"或英文标识如"finance"
operation: 操作类型,可选值: 'read' | 'write' | 'delete' | 'sync'
Returns:
可访问的向量库名称列表
Example:
>>> kb_manager.get_accessible_collections("admin", "finance")
['public_kb', 'dept_finance', 'dept_hr', ...]
>>> kb_manager.get_accessible_collections("user", "技术部", "read")
['public_kb', 'dept_tech']
"""
result = []
if role == "admin":
for info in self.list_collections():
result.append(info.name)
return result
if PUBLIC_KB_NAME in self._metadata.get("collections", {}):
result.append(PUBLIC_KB_NAME)
if department:
normalized_dept = normalize_department_name(department)
if normalized_dept:
dept_kb = f"dept_{normalized_dept}"
if dept_kb in self._metadata.get("collections", {}):
if operation == "read":
result.append(dept_kb)
elif operation in ("write", "delete", "sync"):
if role == "manager":
result.append(dept_kb)
else:
logger.warning(f"部门名称无法标准化: {department}")
return result
def check_permission(
self,
role: str,
department: str,
kb_name: str,
operation: str = "read"
) -> bool:
"""
检查用户对指定向量库的操作权限
Args:
role: 用户角色,可选值: 'admin' | 'manager' | 'user'
department: 用户部门
kb_name: 目标向量库名称
operation: 操作类型,可选值: 'read' | 'write' | 'delete' | 'sync'
Returns:
有权限返回 True无权限返回 False
Example:
>>> kb_manager.check_permission("user", "finance", "dept_finance", "read")
True
>>> kb_manager.check_permission("user", "finance", "dept_finance", "write")
False
"""
accessible = self.get_accessible_collections(role, department, operation)
return kb_name in accessible