Files
abot/base/auth/permission.py
2025-06-09 14:12:31 +08:00

118 lines
3.4 KiB
Python

from typing import Dict, List, Optional
from dataclasses import dataclass
from enum import Enum
import json
import os
from utils.logger import logger
@dataclass
class Permission:
"""权限类"""
key: str
name: str
description: str
value: int
plugin_id: Optional[str] = None
class PermissionStatus(Enum):
"""权限状态枚举"""
ENABLED = 1
DISABLED = 0
class PermissionManager:
"""权限管理器(单例模式)"""
_instance = None
_initialized = False
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not self._initialized:
self._permissions: Dict[str, Permission] = {}
self._config_file = "config/permissions.json"
self._load_permissions()
self._initialized = True
def _load_permissions(self):
"""从配置文件加载权限"""
try:
if os.path.exists(self._config_file):
with open(self._config_file, 'r', encoding='utf-8') as f:
data = json.load(f)
for key, perm_data in data.items():
self._permissions[key] = Permission(**perm_data)
except Exception as e:
logger.error(f"加载权限配置失败: {e}")
def _save_permissions(self):
"""保存权限到配置文件"""
try:
os.makedirs(os.path.dirname(self._config_file), exist_ok=True)
with open(self._config_file, 'w', encoding='utf-8') as f:
json.dump(
{k: v.__dict__ for k, v in self._permissions.items()},
f,
ensure_ascii=False,
indent=2
)
except Exception as e:
logger.error(f"保存权限配置失败: {e}")
def register_permission(
self,
key: str,
name: str,
description: str,
plugin_id: Optional[str] = None
) -> Permission:
"""注册新权限"""
if key in self._permissions:
return self._permissions[key]
value = len(self._permissions) + 1
permission = Permission(
key=key,
name=name,
description=description,
value=value,
plugin_id=plugin_id
)
self._permissions[key] = permission
self._save_permissions()
return permission
def get_permission(self, key: str) -> Optional[Permission]:
"""获取权限"""
return self._permissions.get(key)
def get_permission_by_value(self, value: int) -> Optional[Permission]:
"""通过值获取权限"""
for perm in self._permissions.values():
if perm.value == value:
return perm
return None
def get_all_permissions(self) -> List[Permission]:
"""获取所有权限"""
return list(self._permissions.values())
def get_plugin_permissions(self, plugin_id: str) -> List[Permission]:
"""获取插件的所有权限"""
return [
perm for perm in self._permissions.values()
if perm.plugin_id == plugin_id
]
def remove_permission(self, key: str) -> bool:
"""移除权限"""
if key in self._permissions:
del self._permissions[key]
self._save_permissions()
return True
return False