Exemple : Plugin de Confiance (Trusted Plugin)¶
Le mode trusted est conçu pour les plugins internes qui ont un accès total au système et aux services partagés.
1. Caractéristiques du mode Trusted¶
- Processus Partagé : S'exécute dans le même processus que le Noyau (Kernel).
- Accès Direct : Peut manipuler les instances de services (
db,cache,scheduler) directement. - Routage HTTP : Peut exposer des routers FastAPI personnalisés.
- Performance : Pas d'overhead de communication IPC.
- Signature Requise : En production, les plugins Trusted doivent être signés pour être chargés (
strict_trusted: true).
2. Le Manifeste (plugin.yaml)¶
name: core_auth
version: 2.1.0
author: XCore Internal Team
description: Service d'authentification central du framework
execution_mode: trusted
entry_point: src/main.py
# Déclarer les services requis pour l'initialisation
requires:
- database_service
- cache_service
# Permissions RBAC
permissions:
- resource: "db.users"
actions: ["read", "write"]
effect: allow
- resource: "cache.auth_tokens"
actions: ["write"]
effect: allow
3. Le Code Source (src/main.py)¶
from xcore.sdk import (
TrustedBase,
AutoDispatchMixin,
action,
ok,
error,
require_service
)
import bcrypt
class Plugin(AutoDispatchMixin, TrustedBase):
"""
Plugin Trusted gérant l'authentification.
"""
async def on_load(self) -> None:
"""Accès direct aux services."""
self.db = self.get_service("db")
self.cache = self.get_service("cache")
self.logger.info("Service d'authentification prêt.")
@action("register")
@require_service("db")
async def register_user(self, payload: dict) -> dict:
"""
Action Trusted pour enregistrer un nouvel utilisateur.
Accès total aux API Python (ex: bcrypt).
"""
username = payload.get("username")
password = payload.get("password")
if not username or not password:
return error("Paramètres manquants")
# Hashage du mot de passe (CPU intensif)
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
# Insertion directe en DB
async with self.db.session() as session:
# Imaginons que nous utilisons une fonction helper ici
# user_id = await create_db_user(session, username, hashed)
pass
return ok(username=username, status="registered")
@action("validate_token")
@require_service("cache")
async def validate_token(self, payload: dict) -> dict:
"""
Vérification rapide d'un token dans le cache partagé.
"""
token = payload.get("token")
if not token:
return error("Token manquant")
# Lecture directe du cache Redis partagé
user_data = await self.cache.get(f"auth:token:{token}")
if user_data:
return ok(valid=True, user=user_data)
return ok(valid=False)
4. Points Clés de l'Exemple¶
✅ Accès Full-Stack : Accès à toutes les bibliothèques Python (bcrypt, psycopg2, etc.). ✅ Services Partagés : Utilisation intensive du cache et de la base de données sans latence. ✅ Hautes Performances : Idéal pour les fonctions de sécurité, d'authentification ou de traitement d'image. ✅ Sécurité de Chargement : Ce plugin doit être déposé dans le dossier ./plugins par l'administrateur système.