feat(plugin-system): 引入插件权限节点声明式注册机制,解决了issue#24
重构了插件权限节点的注册方式,从原先在 `on_plugin_loaded` 钩子中调用 API 的命令式注册,改为通过在插件类中声明 `permission_nodes` 列表的声明式注册。 这一改进有以下优点: - **简化插件开发**:插件开发者不再需要在代码中手动调用注册函数,只需在类属性中定义权限节点即可,更加直观和简洁。 - **提升核心健壮性**:权限节点的注册逻辑统一由插件管理器在加载时处理,减少了因插件实现不当导致注册失败或遗漏的风险。 - **增强可读性**:所有权限节点集中定义在插件类的顶部,方便快速了解插件所需的权限。 此变更涉及: - 新增 `PermissionNodeField` 类型用于标准化权限节点定义。 - 在 `PluginBase` 中添加 `permission_nodes` 属性。 - 在 `PluginManager` 中实现插件加载时自动注册权限节点的逻辑。 - 更新 `maizone_refactored` 和 `permission_management` 插件以适应新的声明式注册方式。
This commit is contained in:
committed by
Windpicker-owo
parent
6a9cc2af61
commit
9d79d8a5cb
@@ -106,6 +106,13 @@ class PythonDependency:
|
||||
return self.install_name
|
||||
|
||||
|
||||
@dataclass
|
||||
class PermissionNodeField:
|
||||
"""权限节点声明字段"""
|
||||
|
||||
node_name: str # 节点名称 (例如 "manage" 或 "view")
|
||||
description: str # 权限描述
|
||||
|
||||
@dataclass
|
||||
class ComponentInfo:
|
||||
"""组件信息"""
|
||||
|
||||
@@ -10,6 +10,7 @@ import toml
|
||||
from src.common.logger import get_logger
|
||||
from src.config.config import CONFIG_DIR
|
||||
from src.plugin_system.base.component_types import (
|
||||
PermissionNodeField,
|
||||
PluginInfo,
|
||||
PythonDependency,
|
||||
)
|
||||
@@ -34,6 +35,8 @@ class PluginBase(ABC):
|
||||
|
||||
config_schema: dict[str, dict[str, ConfigField] | str] = {}
|
||||
|
||||
permission_nodes: list["PermissionNodeField"] = []
|
||||
|
||||
config_section_descriptions: dict[str, str] = {}
|
||||
|
||||
def __init__(self, plugin_dir: str, metadata: PluginMetadata):
|
||||
|
||||
@@ -6,6 +6,7 @@ from pathlib import Path
|
||||
from typing import Any, Optional
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.apis.permission_api import permission_api
|
||||
from src.plugin_system.base.component_types import ComponentType
|
||||
from src.plugin_system.base.plugin_base import PluginBase
|
||||
from src.plugin_system.base.plugin_metadata import PluginMetadata
|
||||
@@ -125,6 +126,18 @@ class PluginManager:
|
||||
self.loaded_plugins[plugin_name] = plugin_instance
|
||||
self._show_plugin_components(plugin_name)
|
||||
|
||||
# 注册权限节点
|
||||
if hasattr(plugin_instance, "permission_nodes") and plugin_instance.permission_nodes:
|
||||
for node in plugin_instance.permission_nodes:
|
||||
asyncio.create_task( # noqa: RUF006
|
||||
permission_api.register_permission_node(
|
||||
node_name=node.node_name,
|
||||
description=node.description,
|
||||
plugin_name=plugin_name,
|
||||
)
|
||||
)
|
||||
logger.info(f"为插件 '{plugin_name}' 注册了 {len(plugin_instance.permission_nodes)} 个权限节点")
|
||||
|
||||
# 检查并调用 on_plugin_loaded 钩子(如果存在)
|
||||
if hasattr(plugin_instance, "on_plugin_loaded") and callable(plugin_instance.on_plugin_loaded):
|
||||
logger.debug(f"为插件 '{plugin_name}' 调用 on_plugin_loaded 钩子")
|
||||
@@ -405,6 +418,14 @@ class PluginManager:
|
||||
event_handler_names = [c.name for c in event_handler_components]
|
||||
logger.info(f" 📢 EventHandler组件: {', '.join(event_handler_names)}")
|
||||
|
||||
# 权限节点信息
|
||||
if plugin_instance := self.loaded_plugins.get(plugin_name):
|
||||
if hasattr(plugin_instance, "permission_nodes") and plugin_instance.permission_nodes:
|
||||
node_names = [node.node_name for node in plugin_instance.permission_nodes]
|
||||
logger.info(
|
||||
f" 🔑 权限节点 ({len(node_names)}个): {', '.join(node_names)}"
|
||||
)
|
||||
|
||||
# 依赖信息
|
||||
if plugin_info.dependencies:
|
||||
logger.info(f" 🔗 依赖: {', '.join(plugin_info.dependencies)}")
|
||||
|
||||
Reference in New Issue
Block a user