23 KiB
Umsetzungskonzept RBAC Access (separat, schrittweise)
Ziel
Das RBAC-Konzept aus concept_rbac_access_pending.md technisch umsetzen, inkl.:
- Feature-Containerisierung (plug&play)
- Bootstrap auf System-RBAC reduzieren
- Feature-Services in Container integrieren
- aicore in aichat integrieren
- dynamisches Laden von Routes und Services
- striktes Import-Regelwerk ohne Abhaengigkeiten zwischen Feature-Containern
Import-Regelwerk (Zielzustand)
- Kein Import zwischen Feature-Containern.
- Feature-Container duerfen zentrale Module importieren (
modules/interfaces,modules/datamodels,modules/services,modules/aicore,modules/shared,modules/connectors,modules/security,modules/auth). - Umgekehrt darf zentraler Code keine Feature-Container importieren.
Wichtige konzeptionelle und architektonische Hinweise
- Jeder Feature-Container ist vollstaendig eigenstaendig (Code, Datamodelle, Interfaces, Routes, Services), darf aber zentrale Module nutzen.
- Zentrale Pfade bleiben Plattform-Schnittstellen und duerfen von Features genutzt werden; umgekehrt keine Feature-Imports aus zentralem Code.
- System-RBAC und Feature-RBAC sind strikt getrennt: Bootstrap initialisiert nur System-RBAC, Feature-RBAC entsteht durch Feature-Container.
- Der RBAC-Katalog fuer UI/RESOURCE liegt in
gateway/modules/security/rbacCatalog/und ist persistent; Feature-Container muessen nur registrieren, nicht speichern. - UI/RESOURCE-Objekte werden rein im Backend definiert und persistiert, keine UI-Abhaengigkeit.
- Datenobjekte werden dynamisch abgeleitet, sind aber nicht auf Features beschraenkt (System- und Feature-Tabellen sind sichtbar).
- Strikte Importregel erzeugt harte Grenzen: Shared-Module muessen in den Feature-Container verschoben oder repliziert werden.
- Zentraler Workflow (geplant unter
gateway/modules/workflows/automation/) darf aus Features nicht direkt importiert werden; Zugriff nur ueber feature-interne Adapter/Entry-Points oder durch Verlagerung der benoetigten Teile in die Feature-Container.
Schrittfolge mit Dateiaenderungen und Referenz-Checkliste
Schritt 1: Bootstrap auf System-RBAC reduzieren
Datei: gateway/modules/interfaces/interfaceBootstrap.py
- Entfernen in
initBootstrap():initFeatures(db)_initFeatureTemplateRoleAccessRules(db)
- Entfernen:
_initFeatureTemplateRoles(db)(Funktion + Call-Sites)_initFeatureTemplateRoleAccessRules(db)(Funktion + Call-Sites)
- Beibehalten:
initRoles(db),initRbacRules(db) - Checkliste Referenzen:
- Keine Feature-Initialisierung in Bootstrap
- Keine Feature-Template-Rollen
- Keine Feature-Template-AccessRules
Schritt 2: Feature-Container-Struktur anlegen
Neue Ordner:
gateway/modules/features/trustee/gateway/modules/features/chatbot/(existiert)gateway/modules/features/aichat/(neu)gateway/modules/features/neutralizer/(rename)gateway/modules/features/realestate/(neu)gateway/modules/features/automation/(neu)
Pflichtdateien je Feature:
datamodelFeatureXxx.pyinterfaceFeatureXxx.pyrouteFeatureXxx.pymainXxx.py(RBAC UI/RESOURCE Registry)
Struktur-Vorgaben (Soll):
- Jeder Container enthaelt alle benoetigten Submodule, inkl. Services und Helfer.
- Zentrale Module duerfen genutzt werden; keine Feature-zu-Feature-Imports.
- Service-Subfolder bleiben erhalten, liegen aber direkt im Container (
serviceXxx/).
Calling-Referenzen (allgemein):
gateway/app.pyregistriert alle Feature-Router dynamisch.- Feature-Container registrieren ihre RBAC-Objekte im Katalog (z.B. via
mainXxx.pyals Entry-Point). - Systemcode greift nicht auf Feature-Implementierung zu, sondern nur auf deren registrierte Router/Services.
Schritt 3: Trustee verschieben
Move:
gateway/modules/routes/routeFeatureTrustee.py->gateway/modules/features/trustee/routeFeatureTrustee.pygateway/modules/interfaces/interfaceDbTrustee.py->gateway/modules/features/trustee/interfaceFeatureTrustee.pygateway/modules/datamodels/datamodelTrustee.py->gateway/modules/features/trustee/datamodelFeatureTrustee.pyAdd:gateway/modules/features/trustee/mainTrustee.py(RBAC Katalog)
Referenzen anpassen (Checkliste):
- Alle Imports auf
routeFeatureTrustee.pyneu - Alle Imports auf
interfaceDbTrustee.pyneu - Alle Imports auf
datamodelTrustee.pyneu app.pyRouter-Registrierung auf neuen Pfad Calling-Referenzen (Suche):rg -n "routeFeatureTrustee|interfaceDbTrustee|datamodelTrustee" gateway/
Schritt 4: Chatbot verschieben
Move:
gateway/modules/routes/routeFeatureChatbot.py->gateway/modules/features/chatbot/routeFeatureChatbot.pygateway/modules/interfaces/interfaceDbChatbot.py->gateway/modules/features/chatbot/interfaceFeatureChatbot.pygateway/modules/datamodels/datamodelChatbot.py->gateway/modules/features/chatbot/datamodelFeatureChatbot.pyKeep:gateway/modules/features/chatbot/mainChatbot.py+ Helpers Add:gateway/modules/features/chatbot/mainChatbotCatalog.py(oder in mainChatbot)
Referenzen anpassen:
- Imports fuer
interfaceDbChatbot/datamodelChatbot/routeFeatureChatbot app.pyRouter-Registrierung Calling-Referenzen (Suche):rg -n "routeFeatureChatbot|interfaceDbChatbot|datamodelChatbot" gateway/
Schritt 5: AIChat (chatworkflow) verschieben
Move:
gateway/modules/routes/routeFeatureChatDynamic.py->gateway/modules/features/aichat/routeFeatureAiChat.pygateway/modules/interfaces/interfaceDbChat.py->gateway/modules/features/aichat/interfaceFeatureAiChat.pygateway/modules/datamodels/datamodelChat.py->gateway/modules/features/aichat/datamodelFeatureAiChat.pyAdd:gateway/modules/features/aichat/mainAiChat.py(RBAC Katalog) Keep:gateway/modules/features/workflow/mainWorkflow.py(falls reine Workflow-Logik)
Referenzen anpassen:
- Alle Imports auf
routeFeatureChatDynamic.py - Alle Imports auf
interfaceDbChat.py - Alle Imports auf
datamodelChat.py app.pyRouter-Registrierung Calling-Referenzen (Suche):rg -n "routeFeatureChatDynamic|interfaceDbChat|datamodelChat" gateway/
Schritt 6: Neutralizer verschieben und Ordner umbenennen
Rename:
gateway/modules/features/neutralizePlayground/->gateway/modules/features/neutralizer/Move:gateway/modules/routes/routeFeatureNeutralization.py->gateway/modules/features/neutralizer/routeFeatureNeutralizer.pygateway/modules/datamodels/datamodelNeutralizer.py->gateway/modules/features/neutralizer/datamodelFeatureNeutralizer.pyAdd:gateway/modules/features/neutralizer/mainNeutralizer.py(RBAC Katalog)
Referenzen anpassen:
- Alle Imports auf
neutralizePlayground - Alle Imports auf
routeFeatureNeutralization.py app.pyRouter-Registrierung Calling-Referenzen (Suche):rg -n "neutralizePlayground|routeFeatureNeutralization|datamodelNeutralizer" gateway/
Schritt 7: RealEstate verschieben
Move:
gateway/modules/routes/routeFeatureRealEstate.py->gateway/modules/features/realestate/routeFeatureRealEstate.pygateway/modules/interfaces/interfaceDbRealestate.py->gateway/modules/features/realestate/interfaceFeatureRealEstate.pygateway/modules/datamodels/datamodelRealEstate.py->gateway/modules/features/realestate/datamodelFeatureRealEstate.pyKeep:gateway/modules/features/realEstate/mainRealEstate.pyAdd:gateway/modules/features/realestate/mainRealEstateCatalog.py(oder in mainRealEstate)
Referenzen anpassen:
- Imports auf
interfaceDbRealestate,datamodelRealEstate,routeFeatureRealEstate app.pyRouter-Registrierung Calling-Referenzen (Suche):rg -n "routeFeatureRealEstate|interfaceDbRealestate|datamodelRealEstate" gateway/
Schritt 8: Automation Feature-Container
Move:
gateway/modules/routes/routeDataAutomation.py->gateway/modules/features/automation/routeFeatureAutomation.pyAdd:gateway/modules/features/automation/interfaceFeatureAutomation.pygateway/modules/features/automation/datamodelFeatureAutomation.py- enthaelt
AutomationDefinition
- enthaelt
gateway/modules/features/automation/mainAutomation.py(RBAC Katalog)
Referenzen anpassen:
- Alle Imports von
routeDataAutomation.py - Alle
AutomationDefinition-Imports auf neuen Pfad app.pyRouter-Registrierung Calling-Referenzen (Suche):rg -n "routeDataAutomation|AutomationDefinition" gateway/
Schritt 9: Services in Feature-Container
aichat:
- Move:
gateway/modules/aicore/->gateway/modules/features/aichat/aicore/gateway/modules/services/serviceAi/->gateway/modules/features/aichat/serviceAi/gateway/modules/services/serviceExtraction/->gateway/modules/features/aichat/serviceExtraction/gateway/modules/services/serviceGeneration/->gateway/modules/features/aichat/serviceGeneration/gateway/modules/services/serviceWeb/->gateway/modules/features/aichat/serviceWeb/neutralizer:
- Move:
gateway/modules/services/serviceNeutralization/->gateway/modules/features/neutralizer/serviceNeutralization/Shared Services:
- bleiben in
gateway/modules/services
Referenzen anpassen:
- Alle Imports der o.g. Services auf neue Pfade
- AI-Services duerfen keine Imports ausserhalb des aichat-Containers haben
- In Feature-Folders kein Subfolder
services; Services liegen direkt alsserviceXxx/Calling-Referenzen (Suche): rg -n "modules\\.services\\.service(Ai|Extraction|Generation|Web)|modules\\.aicore" gateway/rg -n "serviceNeutralization" gateway/
Code-Struktur (Soll):
- Feature-Services importieren nur Feature-Datamodelle innerhalb des Containers.
aicorewird komplett unterfeatures/aichat/verschoben und ist nur dort nutzbar.
Schritt 10: Plug&Play Router Loading
Datei: gateway/app.py
- Ersetze statische Imports aus
modules/routesdurch dynamische Feature-Discovery. - Nur existierende Feature-Folder werden registriert.
Referenzen anpassen:
- Alle Router-Registrierungen neu
- Keine Route-Imports aus
modules/routes
Konzept Router-Discovery (Soll):
- Scanne
gateway/modules/features/*/nachrouteFeature*.py. - Pro Datei wird ein
router-Objekt erwartet und registriert. - Fehlende Router in einem Feature duerfen den Start nicht abbrechen (log + skip).
- Feature-Status markieren:
active,degraded(z.B. Router ok, Service-Load fehlschlaegt).
Schritt 11: Plug&Play Service Loading
Zentraler Loader (shared):
- Ein Service-Registry-Modul laedt pro Feature-Container definierte Services.
- Nur existierende Feature-Folder werden registriert.
Referenzen anpassen:
- Alle Service-Center-Aufrufe auf neuen Loader
- Kein direkter Import aus
modules/services/serviceAietc.
Konzept Service-Discovery (Soll):
- Pro Feature-Container werden vorhandene
service*-Ordner als Services erkannt. - Der Loader scannt
gateway/modules/features/<feature>/service*/und registriert diese Services zentral. - Services werden nur geladen, wenn der Feature-Container vorhanden ist.
- Registrierungs-Contract analog
modules/services/__init__.py:- In jedem
service*-Ordner existiertmainService*.pymit Service-Klasse. - Loader instanziert Service und exponiert ihn via
PublicService(...).
- In jedem
Schritt 12: featuresLifecycle anpassen
Datei: gateway/modules/features/featuresLifecycle.py
- Import der Workflow-Logik aus neuem zentralen Pfad (
gateway/modules/workflows/automation/) - Keine Imports von Feature-Containern
Bemerkung:
- Kein Feature-Discovery notwendig: Modul ist zentraler Scheduler fuer Workflow/Automation.
- Update der Imports:
modules.features.workflow->modules.workflows.automation(nach Auslagerung). - Workflow-API ist zentral und stabil: Features duerfen nur explizite Entry-Points nutzen (z.B.
syncAutomationEvents), keine direkten Imports in interne Workflow-Module.
Schritt 13: Globale Referenzen bereinigen
Checkliste:
- Keine Imports von
modules/routes/routeFeature*.pymehr interfaceDb*.pyunddatamodel*.pybleiben fuer System-Module bestehenmodules/services/service*bleiben fuer System-Services bestehenmodules/aicorewird verschoben (Featureaichat), keine zentralen Imports mehr
Calling-Referenzen (Suche):
rg -n "modules\\.routes\\.routeFeature" gateway/
Schritt 14: Tests
- Gateway starten, Router-Registrierung pruefen
- Feature-Folder umbenennen mit z.b. prefix: Route/Service nicht mehr vorhanden
- RBAC Katalog liefert Feature-Objekte
- Bootstrap erzeugt nur System-RBAC
- RBAC Regeln bleiben erhalten, wenn Feature-Ordner entfernt/umbenannt ist (Persistenztest).
- Service-Discovery registriert Services korrekt und markiert
degradedbei Teilfehlern.
Referenz-Checkliste (gesamt)
gateway/app.pyRoutergateway/modules/features/featuresLifecycle.py- alle
routeFeature*.py - alle
interfaceDb*.py - alle
datamodel*.py - alle
main*.pyin Feature-Containern - Service-Center/Service-Loader
- Tests/Fixtures
- RBAC-Katalog Modul in
gateway/modules/security/rbacCatalog/ gateway/modules/interfaces/interfaceBootstrap.py
Import-Analyse (Istzustand, zu verschiebende Module)
Routes (aktueller Stand)
routeFeatureRealEstate.py:- imports:
modules.auth,modules.datamodels.*,modules.interfaces.interfaceDbRealestate,modules.features.realEstate.mainRealEstate,modules.connectors,modules.shared
- imports:
routeFeatureTrustee.py:- imports:
modules.auth,modules.interfaces.interfaceDbTrustee,modules.interfaces.interfaceDbApp,modules.interfaces.interfaceFeatures,modules.datamodels.*
- imports:
routeFeatureChatDynamic.py:- imports:
modules.auth,modules.interfaces.interfaceDbChat,modules.datamodels.datamodelChat,modules.features.workflow
- imports:
routeFeatureChatbot.py:- imports:
modules.auth,modules.interfaces.interfaceDbChat,modules.interfaces.interfaceRbac,modules.datamodels.*,modules.features.chatbot,modules.features.workflow,modules.shared
- imports:
routeFeatureNeutralization.py:- imports:
modules.auth,modules.datamodels.datamodelNeutralizer,modules.features.neutralizePlayground
- imports:
routeDataAutomation.py:- imports:
modules.interfaces.interfaceDbChat,modules.auth,modules.datamodels.datamodelChat,modules.features.workflow,modules.shared
- imports:
Interfaces (aktueller Stand)
interfaceDbTrustee.py:- imports:
modules.connectors,modules.shared,modules.interfaces.interfaceRbac,modules.security,modules.datamodels.*
- imports:
interfaceDbRealestate.py:- imports:
modules.datamodels.*,modules.connectors,modules.shared,modules.security,modules.interfaces.interfaceRbac
- imports:
interfaceDbChat.py/interfaceDbChatbot.py:- imports:
modules.security,modules.datamodels.*,modules.connectors,modules.shared,modules.interfaces.interfaceRbac,modules.interfaces.interfaceDbManagement
- imports:
Feature-Logik (aktueller Stand)
modules/features/chatbot/mainChatbot.py:- imports:
modules.datamodels.*,modules.shared,modules.services,modules.workflows,modules.connectors
- imports:
modules/features/workflow/mainWorkflow.py:- imports:
modules.datamodels.*,modules.shared,modules.services,modules.workflows
- imports:
modules/features/realEstate/mainRealEstate.py:- imports:
modules.datamodels.*,modules.services,modules.interfaces.interfaceDbRealestate,modules.connectors, externe libs
- imports:
modules/features/neutralizePlayground/mainNeutralizePlayground.py:- imports:
modules.datamodels.*,modules.services
- imports:
Services / aicore (aktueller Stand)
modules/services/serviceAi/mainServiceAi.py:- imports:
modules.datamodels.*,modules.services.serviceExtraction,modules.interfaces.interfaceAiObjects,modules.shared
- imports:
modules/services/serviceNeutralization/mainServiceNeutralization.py:- imports:
modules.datamodels.datamodelNeutralizer, eigene subProcess-* Module
- imports:
modules/aicore/*:- imports:
modules.datamodels.*,modules.security,modules.connectors
- imports:
Services Submodule-Analyse (Detail)
serviceAi/
mainServiceAi.py- imports:
modules.datamodels.datamodelChat,modules.datamodels.datamodelAi,modules.datamodels.datamodelExtraction,modules.datamodels.datamodelWorkflow,modules.datamodels.datamodelDocument,modules.interfaces.interfaceAiObjects,modules.services.serviceExtraction,modules.shared
- imports:
subStructureGeneration.py- imports:
modules.datamodels.datamodelExtraction,modules.datamodels.datamodelAi,modules.workflows.processing.shared.stateTools
- imports:
subStructureFilling.py- imports:
modules.datamodels.datamodelExtraction,modules.datamodels.datamodelAi,modules.workflows.processing.shared.stateTools
- imports:
subResponseParsing.py- imports:
modules.shared.jsonUtils,modules.services.serviceAi.subJsonResponseHandling,modules.datamodels.datamodelAi
- imports:
subJsonResponseHandling.py- imports:
modules.shared.jsonUtils,modules.datamodels.datamodelAi
- imports:
subJsonMerger.py- imports:
modules.shared.jsonUtils
- imports:
subDocumentIntents.py- imports:
modules.datamodels.datamodelChat,modules.datamodels.datamodelExtraction,modules.workflows.processing.shared.stateTools
- imports:
subContentExtraction.py- imports:
modules.datamodels.datamodelChat,modules.datamodels.datamodelExtraction,modules.workflows.processing.shared.stateTools
- imports:
subAiCallLooping.py- imports:
modules.datamodels.datamodelAi,modules.datamodels.datamodelExtraction,modules.services.serviceAi.subJsonResponseHandling,modules.services.serviceAi.subLoopingUseCases,modules.workflows.processing.shared.stateTools,modules.shared.jsonContinuation,modules.shared.jsonUtils
- imports:
subLoopingUseCases.py,subJsonResponseHandling.py,subJsonMerger.py(shared utils)- imports:
modules.shared.*(je nach Datei)
- imports:
serviceExtraction/
mainServiceExtraction.py- imports:
modules.datamodels.datamodelExtraction,modules.datamodels.datamodelChat,modules.datamodels.datamodelAi,modules.aicore.aicoreModelRegistry,modules.aicore.aicoreModelSelector,modules.shared.jsonUtils
- imports:
merging/*(mergerText/mergerTable/mergerDefault)- imports:
modules.datamodels.datamodelExtraction
- imports:
extractors/*(Xml/Xlsx/Text/Sql/Pptx/Html/Image/Json/Pdf/Csv/Docx/Binary)- imports:
modules.datamodels.datamodelExtraction(teilweise ContentExtracted)
- imports:
chunking/*(chunkerText/ChunkerTable/ChunkerStructure/ChunkerImage)- imports:
modules.datamodels.datamodelExtraction
- imports:
subRegistry.py- imports:
modules.datamodels.datamodelExtraction
- imports:
subPromptBuilderExtraction.py- imports:
modules.datamodels.datamodelAi
- imports:
subPipeline.py- imports:
modules.datamodels.datamodelExtraction
- imports:
subMerger.py- imports:
modules.datamodels.datamodelExtraction
- imports:
serviceGeneration/
mainServiceGeneration.py- imports:
modules.datamodels.datamodelDocument,modules.datamodels.datamodelChat,modules.services.serviceGeneration.subDocumentUtility
- imports:
renderers/*- imports:
modules.datamodels.datamodelDocument(alle Renderer) documentRendererBaseTemplate.pyimports zusaetzlich:modules.datamodels.datamodelJson,modules.datamodels.datamodelAi
- imports:
paths/*imagePath.py:modules.datamodels.datamodelWorkflow,modules.datamodels.datamodelAidocumentPath.py:modules.datamodels.datamodelWorkflow,modules.datamodels.datamodelExtraction,modules.datamodels.datamodelAi,modules.datamodels.datamodelDocument,modules.workflows.processing.shared.stateToolscodePath.py:modules.datamodels.datamodelWorkflow,modules.datamodels.datamodelExtraction,modules.datamodels.datamodelAi,modules.shared.jsonUtils
subStructureGenerator.py/subPromptBuilderGeneration.py- imports:
modules.datamodels.datamodelJson
- imports:
subContentGenerator.py- imports:
modules.services.serviceGeneration.subContentIntegrator,modules.workflows.processing.shared.stateTools
- imports:
serviceWeb/
mainServiceWeb.py- imports:
modules.datamodels.datamodelAi(AiCallOptions, OperationTypeEnum, AiCallPrompt*)
- imports:
serviceNeutralization/
mainServiceNeutralization.py- imports:
modules.datamodels.datamodelNeutralizer,modules.services.serviceNeutralization.subProcess*
- imports:
subProcessText.py- imports:
modules.services.serviceNeutralization.subParseString
- imports:
subProcessList.py- imports:
modules.services.serviceNeutralization.subParseString,modules.services.serviceNeutralization.subPatterns
- imports:
subParseString.py- imports:
modules.services.serviceNeutralization.subPatterns
- imports:
Compliance-Check gegen Import-Regelwerk (Zielzustand)
Zielkriterium:
- Keine Imports zwischen Feature-Containern.
- Feature-Container duerfen zentrale Module importieren.
- Zentrale Module duerfen keine Feature-Container importieren.
Erwarteter Zustand nach Migration:
- Alle
interfaceFeatureXxx.py,routeFeatureXxx.py,datamodelFeatureXxx.py,mainXxx.pyliegen im jeweiligen Feature-Container. - Interne Feature-Imports (z.B.
chatbot->chatbot.eventManager) sind erlaubt. - Keine Feature-zu-Feature-Imports mehr (z.B.
chatbot->workflowentfaellt durch Auslagerung).
Hinweis zur Validierung:
- Compliance-Check erfolgt nach Abschluss der Verschiebungen und Import-Anpassungen.
- Der Istzustand dient nur als Analysegrundlage und ist nicht compliance-faehig.
Import-Check (Zielzustand, Soll)
Erlaubte Imports innerhalb eines Feature-Containers:
- Relative Imports innerhalb des Containers (z.B.
.eventManager,.subModule). - Absolute Imports innerhalb des eigenen Containers (z.B.
modules.features.chatbot.*im Containerchatbot). - Standardbibliothek und externe Libraries.
Nicht erlaubt (muss im Zielzustand eliminiert werden):
- Imports aus anderen Feature-Containern (
modules.features.<anderesFeature>.*). - Zentrale Module importieren Feature-Container (
modules.features.*).
Soll-Checkliste je Feature-Container:
- Keine
modules.features.<anderesFeature>.*Imports. - Keine Feature-zu-Feature-Abhaengigkeiten.
Pruefroutine (rg-Patterns, Zielzustand):
- Finde direkte Cross-Feature-Imports:
rg -n "modules\\.features\\.(?!<feature>\\.)" gateway/modules/features/<feature>/
- Finde verbotene Feature-Imports aus zentralem Code:
rg -n "modules\\.features\\." gateway/modules/(routes|interfaces|datamodels|services|aicore|shared|connectors|security|auth)/
Istzustand (nur Analyse, vor Migration)
Konflikte (heute):
- Alle Routen, Interfaces, Feature-Logiken und Services importieren Module ausserhalb eines Feature-Containers.
- Es bestehen Imports zwischen Features (z.B.
routeFeatureChatbot->modules.features.workflow, im Zielzustand entfaellt daworkflowkein Feature mehr ist).
Liste der Imports zwischen Features (Istzustand, Analyse):
gateway/modules/interfaces/interfaceDbChatbot.py->modules.features.chatbot.eventManager
Offene Punkte fuer Umsetzung
- Dynamische Feature-Discovery in
app.pyund Service-Loader designen - Schrittweise Migration je Feature mit Tests