权限已修复
This commit is contained in:
44
scripts/clean_permission_nodes.py
Normal file
44
scripts/clean_permission_nodes.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
"""
|
||||||
|
清理权限节点数据库
|
||||||
|
|
||||||
|
删除所有旧的权限节点记录,让系统重新注册
|
||||||
|
"""
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# 添加项目根目录到 Python 路径
|
||||||
|
project_root = Path(__file__).parent.parent
|
||||||
|
sys.path.insert(0, str(project_root))
|
||||||
|
|
||||||
|
from src.common.database.compatibility import get_db_session
|
||||||
|
from src.common.database.core.models import PermissionNodes
|
||||||
|
from src.common.logger import get_logger
|
||||||
|
|
||||||
|
logger = get_logger("CleanPermissionNodes")
|
||||||
|
|
||||||
|
|
||||||
|
async def clean_permission_nodes():
|
||||||
|
"""清理所有权限节点"""
|
||||||
|
try:
|
||||||
|
from sqlalchemy import delete
|
||||||
|
|
||||||
|
async with get_db_session() as session:
|
||||||
|
# 删除所有权限节点
|
||||||
|
stmt = delete(PermissionNodes)
|
||||||
|
result = await session.execute(stmt)
|
||||||
|
await session.commit()
|
||||||
|
|
||||||
|
deleted_count = result.rowcount if hasattr(result, "rowcount") else 0
|
||||||
|
logger.info(f"✅ 已清理 {deleted_count} 个权限节点记录")
|
||||||
|
print(f"✅ 已清理 {deleted_count} 个权限节点记录")
|
||||||
|
print("请重启应用以重新注册权限节点")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ 清理权限节点失败: {e}")
|
||||||
|
print(f"❌ 清理权限节点失败: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(clean_permission_nodes())
|
||||||
@@ -91,17 +91,7 @@ class PermissionAPI:
|
|||||||
allow_relative: bool = True,
|
allow_relative: bool = True,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
self._ensure_manager()
|
self._ensure_manager()
|
||||||
if plugin_name != "__system__":
|
original_name = node_name
|
||||||
expected_prefix = f"plugins.{plugin_name}."
|
|
||||||
if allow_relative and not node_name.startswith("plugins."):
|
|
||||||
node_name = f"{expected_prefix}{node_name}"
|
|
||||||
elif not node_name.startswith(expected_prefix):
|
|
||||||
logger.error(
|
|
||||||
"权限节点名称不符合规范,期望以 %s 开头: %s",
|
|
||||||
expected_prefix,
|
|
||||||
node_name,
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
|
|
||||||
node = PermissionNode(node_name, description, plugin_name, default_granted)
|
node = PermissionNode(node_name, description, plugin_name, default_granted)
|
||||||
if not self._permission_manager:
|
if not self._permission_manager:
|
||||||
|
|||||||
@@ -131,20 +131,12 @@ class PermissionManager(IPermissionManager):
|
|||||||
bool: 注册是否成功
|
bool: 注册是否成功
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
expected_prefix = f"plugins.{node.plugin_name}."
|
|
||||||
if node.plugin_name != "__system__" and not node.node_name.startswith(expected_prefix):
|
|
||||||
logger.error(
|
|
||||||
"权限节点名称不符合规范,期望以 %s 开头: %s",
|
|
||||||
expected_prefix,
|
|
||||||
node.node_name,
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
|
|
||||||
async with self.SessionLocal() as session:
|
async with self.SessionLocal() as session:
|
||||||
# 检查节点是否已存在(仅支持规范化后的名称)
|
# 检查节点是否已存在
|
||||||
result = await session.execute(select(PermissionNodes).filter_by(node_name=node.node_name))
|
result = await session.execute(select(PermissionNodes).filter_by(node_name=node.node_name))
|
||||||
existing_node = result.scalar_one_or_none()
|
existing_node = result.scalar_one_or_none()
|
||||||
if existing_node:
|
if existing_node:
|
||||||
|
# 更新现有节点的信息
|
||||||
existing_node.description = node.description
|
existing_node.description = node.description
|
||||||
existing_node.plugin_name = node.plugin_name
|
existing_node.plugin_name = node.plugin_name
|
||||||
existing_node.default_granted = node.default_granted
|
existing_node.default_granted = node.default_granted
|
||||||
@@ -344,12 +336,6 @@ class PermissionManager(IPermissionManager):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
async with self.SessionLocal() as session:
|
async with self.SessionLocal() as session:
|
||||||
# 移除未规范化的旧权限节点
|
|
||||||
await session.execute(
|
|
||||||
delete(PermissionNodes).where(~PermissionNodes.node_name.like("plugins.%"))
|
|
||||||
)
|
|
||||||
await session.commit()
|
|
||||||
|
|
||||||
result = await session.execute(select(PermissionNodes))
|
result = await session.execute(select(PermissionNodes))
|
||||||
nodes = result.scalars().all()
|
nodes = result.scalars().all()
|
||||||
return [
|
return [
|
||||||
@@ -381,14 +367,6 @@ class PermissionManager(IPermissionManager):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
async with self.SessionLocal() as session:
|
async with self.SessionLocal() as session:
|
||||||
# 返回前清理未规范化的旧节点
|
|
||||||
await session.execute(
|
|
||||||
delete(PermissionNodes)
|
|
||||||
.where(PermissionNodes.plugin_name == plugin_name)
|
|
||||||
.where(~PermissionNodes.node_name.like("plugins.%"))
|
|
||||||
)
|
|
||||||
await session.commit()
|
|
||||||
|
|
||||||
result = await session.execute(select(PermissionNodes).filter_by(plugin_name=plugin_name))
|
result = await session.execute(select(PermissionNodes).filter_by(plugin_name=plugin_name))
|
||||||
nodes = result.scalars().all()
|
nodes = result.scalars().all()
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from src.plugin_system.apis.send_api import text_to_stream
|
|||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def require_permission(permission_node: str, deny_message: str | None = None, *, use_full_name: bool = True):
|
def require_permission(permission_node: str, deny_message: str | None = None, *, use_full_name: bool = False):
|
||||||
"""
|
"""
|
||||||
权限检查装饰器
|
权限检查装饰器
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ def require_permission(permission_node: str, deny_message: str | None = None, *,
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
full_permission_node = f"plugins.{plugin_name}.{permission_node}"
|
full_permission_node = f"plugins.{plugin_name}.{permission_node}"
|
||||||
logger.debug(f"自动构建权限节点: {permission_node} -> {full_permission_node}")
|
logger.info(f"自动构建权限节点: {permission_node} -> {full_permission_node} (插件: {plugin_name})")
|
||||||
|
|
||||||
# 检查权限
|
# 检查权限
|
||||||
if not chat_stream.user_info or not chat_stream.user_info.user_id:
|
if not chat_stream.user_info or not chat_stream.user_info.user_id:
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ console_log_level = "INFO" # 控制台日志级别,可选: DEBUG, INFO, WARNIN
|
|||||||
file_log_level = "DEBUG" # 文件日志级别,可选: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
file_log_level = "DEBUG" # 文件日志级别,可选: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||||
|
|
||||||
# 第三方库日志控制
|
# 第三方库日志控制
|
||||||
suppress_libraries = ["faiss","httpx", "urllib3", "asyncio", "websockets", "httpcore", "requests", "peewee", "openai","uvicorn","rjieba","maim_message"] # 完全屏蔽的库
|
suppress_libraries = ["faiss","httpx", "urllib3", "asyncio", "websockets", "httpcore", "requests", "aiosqlite", "openai","uvicorn","rjieba","maim_message"] # 完全屏蔽的库
|
||||||
library_log_levels = { "aiohttp" = "WARNING"} # 设置特定库的日志级别
|
library_log_levels = { "aiohttp" = "WARNING"} # 设置特定库的日志级别
|
||||||
|
|
||||||
[dependency_management] # 插件Python依赖管理配置
|
[dependency_management] # 插件Python依赖管理配置
|
||||||
|
|||||||
Reference in New Issue
Block a user