Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c7586f6d9 | ||
|
|
b2a641cac2 | ||
|
|
e9f8e0a1f8 |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/idm-webui",
|
"name": "@govoplan/idm-webui",
|
||||||
"version": "0.1.18",
|
"version": "0.1.24",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "webui/src/index.ts",
|
"main": "webui/src/index.ts",
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-idm"
|
name = "govoplan-idm"
|
||||||
version = "0.1.21"
|
version = "0.1.24"
|
||||||
description = "GovOPlaN identity management bridge module."
|
description = "GovOPlaN identity management bridge module."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
"""German translations for public structured documentation metadata."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'idm.reference.assignment-governance': {'consequence_classes': {'emergency_override': 'Umgeht den '
|
||||||
|
'normalen '
|
||||||
|
'geregelten '
|
||||||
|
'Antrags- '
|
||||||
|
'oder '
|
||||||
|
'Gewährungspfad '
|
||||||
|
'und '
|
||||||
|
'erfordert '
|
||||||
|
'beibehaltene '
|
||||||
|
'Gründe und '
|
||||||
|
'Nachweise.',
|
||||||
|
'function_decision': 'Erweitert '
|
||||||
|
'oder '
|
||||||
|
'beendet '
|
||||||
|
'eine '
|
||||||
|
'geregelte '
|
||||||
|
'Änderung '
|
||||||
|
'und behält '
|
||||||
|
'handelnde '
|
||||||
|
'Person, '
|
||||||
|
'Kommentar, '
|
||||||
|
'Politik und '
|
||||||
|
'Workflow-Nachweise.',
|
||||||
|
'governance_settings': 'Ändert, '
|
||||||
|
'ob '
|
||||||
|
'direkte '
|
||||||
|
'Zuordnungsmutationen '
|
||||||
|
'genehmigte '
|
||||||
|
'Änderungsnachweise '
|
||||||
|
'erfordern.',
|
||||||
|
'timed_escalation': 'Zeichnet '
|
||||||
|
'eine '
|
||||||
|
'überfällige '
|
||||||
|
'Überprüfung '
|
||||||
|
'und genaue '
|
||||||
|
'Zielfunktion '
|
||||||
|
'auf, ohne '
|
||||||
|
'eine '
|
||||||
|
'Genehmigung '
|
||||||
|
'zu ersetzen '
|
||||||
|
'oder '
|
||||||
|
'abzuschließen.'}},
|
||||||
|
'idm.reference.fields-and-consequences': {'consequence_classes': {'acting_for': 'Ermöglicht es '
|
||||||
|
'einem gebundenen '
|
||||||
|
'Konto, anstelle '
|
||||||
|
'einer '
|
||||||
|
'Quellzuweisung '
|
||||||
|
'zu handeln, wenn '
|
||||||
|
'Organisationen '
|
||||||
|
'dies zulassen.',
|
||||||
|
'assignment': 'Ändert die '
|
||||||
|
'effektive '
|
||||||
|
'institutionelle '
|
||||||
|
'Funktion, die '
|
||||||
|
'von optionalen '
|
||||||
|
'nachgelagerten '
|
||||||
|
'Fähigkeiten '
|
||||||
|
'verbraucht wird.',
|
||||||
|
'deactivate_or_expire': 'Entfernt '
|
||||||
|
'die '
|
||||||
|
'Tatsache '
|
||||||
|
'aus '
|
||||||
|
'der '
|
||||||
|
'effektiven '
|
||||||
|
'Auflösung, '
|
||||||
|
'während '
|
||||||
|
'Provenienz '
|
||||||
|
'und '
|
||||||
|
'Lebenszyklus '
|
||||||
|
'Nachweise '
|
||||||
|
'beibehalten.',
|
||||||
|
'delegation': 'Erstellt eine '
|
||||||
|
'begrenzte '
|
||||||
|
'abgeleitete '
|
||||||
|
'Zuweisung, die '
|
||||||
|
'an die '
|
||||||
|
'Quellzuweisung '
|
||||||
|
'gebunden bleibt.',
|
||||||
|
'escalation': 'Leitet eine '
|
||||||
|
'überfällige '
|
||||||
|
'Überprüfung '
|
||||||
|
'sichtbar zu '
|
||||||
|
'einer genau '
|
||||||
|
'konfigurierten '
|
||||||
|
'Funktion, ohne '
|
||||||
|
'die Entscheidung '
|
||||||
|
'abzuschließen.',
|
||||||
|
'retention': 'Ändert, wie lange '
|
||||||
|
'detaillierte '
|
||||||
|
'Zuordnungsänderungsnachweise '
|
||||||
|
'verfügbar '
|
||||||
|
'bleiben.'}},
|
||||||
|
'idm.reference.typed-relationships': {'consequences': ['Ein zukünftiger Start verzögert die '
|
||||||
|
'Mitgliedschaft bis zum ausgewählten '
|
||||||
|
'Zeitpunkt.',
|
||||||
|
'Expiry entfernt die Beziehung von der '
|
||||||
|
'effektiven Auflösung, während Nachweise '
|
||||||
|
'aufbewahrt werden.',
|
||||||
|
'Der Widerruf entfernt die Beziehung '
|
||||||
|
'sofort von der effektiven Auflösung und '
|
||||||
|
'kann nicht rückgängig gemacht werden.',
|
||||||
|
'Das Ändern einer extern beschafften '
|
||||||
|
'Tatsache ohne übereinstimmende Provenienz '
|
||||||
|
'kann die Verantwortlichkeit für die '
|
||||||
|
'Abstimmung unterbrechen.'],
|
||||||
|
'limitations': ['Mitgliedschaftsbeschlüsse sind '
|
||||||
|
'mieterspezifisch und lehnen '
|
||||||
|
'mieterübergreifende Gruppenreferenzen ab.',
|
||||||
|
'Eine widerrufene Beziehung ist '
|
||||||
|
'unveränderlich und erfordert einen Ersatz '
|
||||||
|
'für eine spätere Wiederverwendung.',
|
||||||
|
'Die Mitgliedschaft allein aktiviert '
|
||||||
|
'niemals eine Identität oder erteilt eine '
|
||||||
|
'Antragsberechtigung.'],
|
||||||
|
'outcome': 'Der Mandant hat erklärbare, effektiv datierte '
|
||||||
|
'Geschäftsmitgliedschaftsfakten, die '
|
||||||
|
'nachgelagerte Verbraucher lösen können, ohne '
|
||||||
|
'IDM-Interna zu importieren oder Zugriffsrechte '
|
||||||
|
'abzuleiten.',
|
||||||
|
'prerequisites': ['Die Identitäten existieren im '
|
||||||
|
'Mandanten-Identitätsverzeichnis.',
|
||||||
|
'Die handelnde Person hat die Berechtigung '
|
||||||
|
'zum Lesen von Beziehungen und die '
|
||||||
|
'Berechtigung zum Schreiben von '
|
||||||
|
'Mutationen.',
|
||||||
|
'Die verantwortliche Quelle, das '
|
||||||
|
'effektive Fenster, die Art der Beziehung '
|
||||||
|
'und der Geschäftszweck sind bekannt.'],
|
||||||
|
'steps': ['Erstellen oder wählen Sie eine typisierte Gruppe '
|
||||||
|
'mit einem stabilen Schlüssel, Typ und Herkunft '
|
||||||
|
'aus.',
|
||||||
|
'Erstellen Sie eine Beziehung zu durchsuchbaren '
|
||||||
|
'Betreff- und Zielreferenzen und dem '
|
||||||
|
'beabsichtigten Gültigkeitsfenster.',
|
||||||
|
'Überprüfen Sie effektive Mitgliedschaften zum '
|
||||||
|
'jeweiligen Zeitpunkt und überprüfen Sie jede '
|
||||||
|
'eingeschlossene oder ausgeschlossene '
|
||||||
|
'Entscheidung.',
|
||||||
|
'Widerrufen Sie eine Beziehung mit einem '
|
||||||
|
'vorgehaltenen Grund, wenn die Tatsache vor ihrem '
|
||||||
|
'geplanten Ende aufhören muss.'],
|
||||||
|
'verification': 'Laden Sie beide Verzeichnisse neu, '
|
||||||
|
'bestätigen Sie die Datensatzrevision und '
|
||||||
|
'die Quellfelder und lösen Sie dann die '
|
||||||
|
'Mitgliedschaften der Zielgruppe zu Zeiten '
|
||||||
|
'vor, während und nach dem '
|
||||||
|
'Gültigkeitsfenster auf. Stellen Sie '
|
||||||
|
'sicher, dass Zugriffsberechtigungen '
|
||||||
|
'unverändert bleiben.'},
|
||||||
|
'idm.scim-provisioning': {'consequences': ['Ein unvollständiger oder fehlgeschlagener Snapshot '
|
||||||
|
'kann eine lokale Identität nicht deaktivieren.',
|
||||||
|
'Ein geänderter unveränderlicher Wert oder eine '
|
||||||
|
'Kollision blockiert die automatische Verknüpfung.',
|
||||||
|
'Ein vollständiger Snapshot kann nur dann eine '
|
||||||
|
'Deaktivierung vorschlagen, wenn die Mandantrichtlinie '
|
||||||
|
'ihn explizit auswählt.'],
|
||||||
|
'limitations': ['Diese Version zeigt eine Vorschau, wendet jedoch keine '
|
||||||
|
'SCIM-Bereitstellungspläne an.',
|
||||||
|
'Cursor-Paginierung wird nicht verwendet, bis '
|
||||||
|
'angekündigt und durch einen Provider-Zieltest '
|
||||||
|
'abgedeckt.',
|
||||||
|
'Eine SCIM-Gruppenmitgliedschaft wird niemals '
|
||||||
|
'automatisch zur Zugriffsberechtigung.'],
|
||||||
|
'prerequisites': ['Der Anbieter stellt RFC 7643 Benutzer- und '
|
||||||
|
'Gruppenressourcen über SCIM 2.0 zur Verfügung.',
|
||||||
|
'Ein anbietereigenes unveränderliches '
|
||||||
|
'Übereinstimmungsattribut wurde ausgewählt und '
|
||||||
|
'kollisionsgetestet.',
|
||||||
|
'Die Authentifizierung erfolgt in einem Scoped Access '
|
||||||
|
'Credential-Umschlag.'],
|
||||||
|
'steps': ['Lesen Sie jede Benutzer- und Gruppenseite in einem '
|
||||||
|
'vollständigen Snapshot.',
|
||||||
|
'Überprüfung von Schema, Paginierung, Kollision und Diagnose '
|
||||||
|
'von unveränderlichen Werten.',
|
||||||
|
'Überprüfen Sie jede Erstellung, Verknüpfung, Aktualisierung, '
|
||||||
|
'Deaktivierung oder Quarantäne und die erwartete lokale '
|
||||||
|
'Überarbeitung.',
|
||||||
|
'Entsorgen und neu erstellen Sie den Plan nach jeder '
|
||||||
|
'Anbieter, Mapping oder lokale Revision Änderung.'],
|
||||||
|
'verification': 'Vergleichen Sie Seitensummen, Quellen- und '
|
||||||
|
'Planverdauungen, erwartete lokale Überarbeitungen, '
|
||||||
|
'Kollisionsdiagnosen und die Abwesenheitsrichtlinien, '
|
||||||
|
'bevor Sie eine spätere Ausführung genehmigen.'}}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from govoplan_core.core.modules import with_documentation_structured_translations
|
||||||
|
from govoplan_idm.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS
|
||||||
|
|
||||||
from datetime import UTC, datetime
|
from datetime import UTC, datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -66,7 +69,7 @@ from govoplan_idm.backend.search_source import create_idm_search_source
|
|||||||
from govoplan_idm.backend.scim import SCIM_EXTERNAL_PROVIDER_ID
|
from govoplan_idm.backend.scim import SCIM_EXTERNAL_PROVIDER_ID
|
||||||
|
|
||||||
|
|
||||||
MODULE_VERSION = "0.1.21"
|
MODULE_VERSION = "0.1.24"
|
||||||
|
|
||||||
IDM_READ_SCOPES = (
|
IDM_READ_SCOPES = (
|
||||||
"idm:organization_assignment:read",
|
"idm:organization_assignment:read",
|
||||||
@@ -204,7 +207,9 @@ def _idm_directory(context: ModuleContext) -> object:
|
|||||||
from govoplan_idm.backend.directory import SqlIdmDirectory
|
from govoplan_idm.backend.directory import SqlIdmDirectory
|
||||||
|
|
||||||
identities = context.registry.require_capability(CAPABILITY_IDENTITY_DIRECTORY)
|
identities = context.registry.require_capability(CAPABILITY_IDENTITY_DIRECTORY)
|
||||||
organizations = context.registry.require_capability(CAPABILITY_ORGANIZATION_DIRECTORY)
|
organizations = context.registry.require_capability(
|
||||||
|
CAPABILITY_ORGANIZATION_DIRECTORY
|
||||||
|
)
|
||||||
if not isinstance(identities, IdentityDirectory):
|
if not isinstance(identities, IdentityDirectory):
|
||||||
raise RuntimeError(f"Invalid capability: {CAPABILITY_IDENTITY_DIRECTORY}")
|
raise RuntimeError(f"Invalid capability: {CAPABILITY_IDENTITY_DIRECTORY}")
|
||||||
if not isinstance(organizations, OrganizationDirectory):
|
if not isinstance(organizations, OrganizationDirectory):
|
||||||
@@ -376,12 +381,32 @@ manifest = ModuleManifest(
|
|||||||
factory=create_idm_search_source,
|
factory=create_idm_search_source,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
nav_items=(NavItem(path="/idm", label="IDM", icon="users", required_any=IDM_READ_SCOPES, order=72),),
|
nav_items=(
|
||||||
|
NavItem(
|
||||||
|
path="/idm",
|
||||||
|
label="IDM",
|
||||||
|
icon="users",
|
||||||
|
required_any=IDM_READ_SCOPES,
|
||||||
|
order=72,
|
||||||
|
),
|
||||||
|
),
|
||||||
frontend=FrontendModule(
|
frontend=FrontendModule(
|
||||||
module_id="idm",
|
module_id="idm",
|
||||||
package_name="@govoplan/idm-webui",
|
package_name="@govoplan/idm-webui",
|
||||||
routes=(FrontendRoute(path="/idm", component="IdmPage", required_any=IDM_READ_SCOPES, order=72),),
|
routes=(
|
||||||
nav_items=(NavItem(path="/idm", label="IDM", icon="users", required_any=IDM_READ_SCOPES, order=72),),
|
FrontendRoute(
|
||||||
|
path="/idm", component="IdmPage", required_any=IDM_READ_SCOPES, order=72
|
||||||
|
),
|
||||||
|
),
|
||||||
|
nav_items=(
|
||||||
|
NavItem(
|
||||||
|
path="/idm",
|
||||||
|
label="IDM",
|
||||||
|
icon="users",
|
||||||
|
required_any=IDM_READ_SCOPES,
|
||||||
|
order=72,
|
||||||
|
),
|
||||||
|
),
|
||||||
product_areas=(
|
product_areas=(
|
||||||
ProductAreaContribution(
|
ProductAreaContribution(
|
||||||
id="people-responsibility",
|
id="people-responsibility",
|
||||||
@@ -548,9 +573,7 @@ manifest = ModuleManifest(
|
|||||||
"organizations",
|
"organizations",
|
||||||
"records",
|
"records",
|
||||||
),
|
),
|
||||||
conditions=(
|
conditions=(DocumentationCondition(required_modules=("idm", "access")),),
|
||||||
DocumentationCondition(required_modules=("idm", "access")),
|
|
||||||
),
|
|
||||||
links=(
|
links=(
|
||||||
DocumentationLink(
|
DocumentationLink(
|
||||||
label="Data-subject requests",
|
label="Data-subject requests",
|
||||||
@@ -563,6 +586,28 @@ manifest = ModuleManifest(
|
|||||||
kind="runtime",
|
kind="runtime",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "IDM-Daten in einer Betroffenenanfrage prüfen",
|
||||||
|
"summary": (
|
||||||
|
"Mandantenbezogene institutionelle Funktions- und Beziehungsmerkmale erfassen und dabei gesteuerte "
|
||||||
|
"Entscheidungsnachweise bewahren."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"IDM durchsucht bestätigte Konto- und Identitätsselektoren sowie namensraumgebundene Zuweisungs-, Beziehungs- und "
|
||||||
|
"Zuweisungsänderungsverweise. Ergebnisse umfassen zeitlich wirksame Organisationsfunktionszuweisungen, typisierte "
|
||||||
|
"Identitätsbeziehungen mit minimiertem Gruppenkontext, gesteuerte Zuweisungsanträge oder -erteilungen und zugehörige "
|
||||||
|
"Lebenszyklusereignisse. Betrifft ein Datensatz eine andere kandidierende oder handelnde Person, werden deren Identitäts- "
|
||||||
|
"und Kontokennungen aus dem automatischen Export entfernt. Einstellungen, Gruppeneigenschaften, externe Quellverweise, "
|
||||||
|
"Herkunft, Begründungen, Nachweislisten, Richtlinienentscheidungen, Workflow-Interna, Idempotenzschlüssel, Anfrage-Digests, "
|
||||||
|
"undurchsichtige Metadaten, Ereigniskommentare und -details, unbeteiligte Datensätze und andere Mandanten sind ausgeschlossen. "
|
||||||
|
"Zuweisungen und Beziehungen sind wirksame institutionelle Tatsachen; Korrektur, Widerruf, Deaktivierung oder Ablauf "
|
||||||
|
"erfordern daher eine berechtigte IDM-Lebenszyklusprüfung. Gesteuerte Änderungs- und Ereignisdatensätze bewahren "
|
||||||
|
"ausdrückliche Gründe für Entscheidungsnachweise. Identity besitzt den Personendatensatz, Organizations Funktionen und "
|
||||||
|
"Einheiten und Access die aus bestätigten IDM-Tatsachen abgeleitete Befugnis."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "guide",
|
"kind": "guide",
|
||||||
"help_contexts": [
|
"help_contexts": [
|
||||||
@@ -587,6 +632,21 @@ manifest = ModuleManifest(
|
|||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("tenant_admin", "access_admin", "operator"),
|
audience=("tenant_admin", "access_admin", "operator"),
|
||||||
related_modules=("search", "identity", "organizations"),
|
related_modules=("search", "identity", "organizations"),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Berechtigte IDM-Datensätze durchsuchen",
|
||||||
|
"summary": (
|
||||||
|
"Typisierte Gruppen, zeitlich wirksame Beziehungen und Organisationsfunktionszuweisungen für die "
|
||||||
|
"berechtigungsbewusste Plattform-Suche bereitstellen."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Ist Search installiert, liefert IDM begrenzte Verzeichnis- und Zuweisungsmetadaten, ohne uneingeschränkte "
|
||||||
|
"Herkunftsdaten zu kopieren. Jedes Ergebnis bleibt mandantengebunden und prüft die aktuelle Leseberechtigung für "
|
||||||
|
"Zuweisung oder Beziehung erneut. Festgeschriebene IDM-Lebenszyklusereignisse aktualisieren den abgeleiteten Index; ein "
|
||||||
|
"betrieblicher Neuaufbau gleicht Datensätze ab, die vor der Aktivierung von Search angelegt wurden."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
order=25,
|
order=25,
|
||||||
),
|
),
|
||||||
DocumentationTopic(
|
DocumentationTopic(
|
||||||
@@ -602,6 +662,20 @@ manifest = ModuleManifest(
|
|||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("tenant_admin", "access_admin", "operator"),
|
audience=("tenant_admin", "access_admin", "operator"),
|
||||||
related_modules=("identity", "organizations", "access"),
|
related_modules=("identity", "organizations", "access"),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Brücke zwischen Identität und Organisation",
|
||||||
|
"summary": (
|
||||||
|
"IDM löst auf, welche Identitäten und Konten Organisationsfunktionszuweisungen zugeordnet werden können."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Identity besitzt normalisierte Identitäten und Kontoverknüpfungen. Organizations besitzt Einheiten und Funktionen. "
|
||||||
|
"IDM besitzt die Zuweisungsverknüpfungen zwischen Identitäten und Organisationsfunktionen, einschließlich Identitätssuche "
|
||||||
|
"für Organisationszuweisungen und zukünftiger Synchronisations-/Zuordnungsabläufe. Access darf diese Verknüpfungen nutzen, "
|
||||||
|
"wenn IDM installiert ist; IDM benötigt Access jedoch nicht, um Rechte auszuwerten."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
order=26,
|
order=26,
|
||||||
),
|
),
|
||||||
DocumentationTopic(
|
DocumentationTopic(
|
||||||
@@ -631,6 +705,26 @@ manifest = ModuleManifest(
|
|||||||
kind="api",
|
kind="api",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Governance von IDM-Zuweisungen",
|
||||||
|
"summary": (
|
||||||
|
"Mandantenbezogene IDM-Einstellungen können freigegebene Änderungsanträge verlangen, bevor "
|
||||||
|
"Identitäts-Funktionszuweisungen angewendet werden."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Zuweisungsverknüpfungen haben hohe Auswirkung, weil sie später Zugriffsentscheidungen speisen können. Mandanten können "
|
||||||
|
"aufgezeichnete Änderungsanträge für Anlage und Aktualisierung von Zuweisungen verlangen. Zusätzlich lassen sich "
|
||||||
|
"Obergrenzen für Tiefe und Gültigkeit von Delegationsketten sowie ausdrückliche Eskalationsziele und Fristen für Prüfungen "
|
||||||
|
"durch Inhabende, verantwortliche Stelle oder Empfangende konfigurieren. IDM prüft vollständige Wege bei jeder "
|
||||||
|
"Entscheidung und der endgültigen Anwendung gegen die aktuelle Policy. Abgelaufene Fristen werden als sichtbarer "
|
||||||
|
"eskalierter Zustand mit Notifications- und Auditnachweis erfasst; eine Freigabe wird nicht unterstellt. Ein periodischer "
|
||||||
|
"Worker sendet genau ein Ablaufereignis, wenn eine zukünftige Zuweisung endet. Kennzeichnung und Ereignis werden gemeinsam "
|
||||||
|
"festgeschrieben, damit Wiederholungen idempotent bleiben. Der alte Bereich organizations:function:assign bleibt während "
|
||||||
|
"des Übergangs gültig; neue Rollenvorlagen sollten idm:organization_assignment:write gewähren."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "reference",
|
"kind": "reference",
|
||||||
"help_contexts": [
|
"help_contexts": [
|
||||||
@@ -672,10 +766,24 @@ manifest = ModuleManifest(
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
links=(
|
links=(
|
||||||
DocumentationLink(label="IDM relationship administration", href="/idm", kind="runtime"),
|
DocumentationLink(
|
||||||
DocumentationLink(label="Typed groups API", href="/api/v1/idm/typed-groups", kind="api"),
|
label="IDM relationship administration", href="/idm", kind="runtime"
|
||||||
DocumentationLink(label="Identity relationships API", href="/api/v1/idm/relationships", kind="api"),
|
),
|
||||||
DocumentationLink(label="Typed relationship contract", href="docs/TYPED_RELATIONSHIPS.md", kind="repository"),
|
DocumentationLink(
|
||||||
|
label="Typed groups API",
|
||||||
|
href="/api/v1/idm/typed-groups",
|
||||||
|
kind="api",
|
||||||
|
),
|
||||||
|
DocumentationLink(
|
||||||
|
label="Identity relationships API",
|
||||||
|
href="/api/v1/idm/relationships",
|
||||||
|
kind="api",
|
||||||
|
),
|
||||||
|
DocumentationLink(
|
||||||
|
label="Typed relationship contract",
|
||||||
|
href="docs/TYPED_RELATIONSHIPS.md",
|
||||||
|
kind="repository",
|
||||||
|
),
|
||||||
),
|
),
|
||||||
translations={
|
translations={
|
||||||
"de": {
|
"de": {
|
||||||
@@ -779,9 +887,7 @@ manifest = ModuleManifest(
|
|||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("tenant_admin", "access_admin", "operator", "user"),
|
audience=("tenant_admin", "access_admin", "operator", "user"),
|
||||||
related_modules=("identity", "organizations", "access"),
|
related_modules=("identity", "organizations", "access"),
|
||||||
conditions=(
|
conditions=(DocumentationCondition(any_scopes=IDM_READ_SCOPES),),
|
||||||
DocumentationCondition(any_scopes=IDM_READ_SCOPES),
|
|
||||||
),
|
|
||||||
links=(
|
links=(
|
||||||
DocumentationLink(
|
DocumentationLink(
|
||||||
label="IDM assignments",
|
label="IDM assignments",
|
||||||
@@ -794,6 +900,24 @@ manifest = ModuleManifest(
|
|||||||
kind="api",
|
kind="api",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Einer Identität eine Organisationsfunktion zuweisen",
|
||||||
|
"summary": (
|
||||||
|
"IDM verknüpft Identitäten oder Konten mit Organisationsfunktionen; Access kann bestätigte Verknüpfungen bei "
|
||||||
|
"vorhandener Funktions-Rollenzuordnung verwenden."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Legen Sie zuerst Einheit und Funktion in Organizations an und stellen Sie sicher, dass Person und Konto in Identity "
|
||||||
|
"bestehen. Erstellen Sie anschließend die Zuweisung in IDM. Direkte Zuweisungen halten fest, wer die Funktion innehat. "
|
||||||
|
"Delegierte Zuweisungen benötigen eine Quellzuweisung und eine delegierbare Funktion. Stellvertretungszuweisungen benötigen "
|
||||||
|
"Quellzuweisung, handelndes Konto und eine Funktion, die Handeln an Stelle zulässt. Access bildet bestätigte "
|
||||||
|
"Funktionsmerkmale auf Rollen und Rechte ab; ohne eine solche Zuordnung wird die Zuweisung gespeichert, gewährt aber keine "
|
||||||
|
"Anwendungsberechtigungen. Der Zuweisungsarbeitsbereich nutzt die verfügbare Anwendungsbreite, sodass Governance-Steuerungen "
|
||||||
|
"und Zuweisungsdaten gemeinsam sichtbar bleiben."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "workflow",
|
"kind": "workflow",
|
||||||
"help_contexts": [
|
"help_contexts": [
|
||||||
@@ -835,7 +959,14 @@ manifest = ModuleManifest(
|
|||||||
layer="configured",
|
layer="configured",
|
||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("tenant_admin", "access_admin", "operator", "user"),
|
audience=("tenant_admin", "access_admin", "operator", "user"),
|
||||||
related_modules=("identity", "organizations", "access", "policy", "audit", "workflow_engine"),
|
related_modules=(
|
||||||
|
"identity",
|
||||||
|
"organizations",
|
||||||
|
"access",
|
||||||
|
"policy",
|
||||||
|
"audit",
|
||||||
|
"workflow_engine",
|
||||||
|
),
|
||||||
links=(
|
links=(
|
||||||
DocumentationLink(
|
DocumentationLink(
|
||||||
label="Function assignment workflows",
|
label="Function assignment workflows",
|
||||||
@@ -843,6 +974,30 @@ manifest = ModuleManifest(
|
|||||||
kind="repository",
|
kind="repository",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Felder und Folgen von IDM-Zuweisungen",
|
||||||
|
"summary": (
|
||||||
|
"Referenz für direkte Zuweisungen, Delegation, Stellvertretung, Wirksamkeitsdaten, gesteuerte Änderungen, Nachweise und "
|
||||||
|
"Aufbewahrung."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Identität und Konto wählen, wer die institutionelle Tatsache erhält; Funktion und Einheit gehören Organizations. Die "
|
||||||
|
"Quelle unterscheidet direkte, delegierte, stellvertretende, Verzeichnis-, Governance- und Systemtatsachen. Delegation und "
|
||||||
|
"Stellvertretung verlangen eine gültige Quellzuweisung und die entsprechende Organizations-Funktionsberechtigung. Eine "
|
||||||
|
"delegierte Person handelt als sie selbst; bei Stellvertretung muss Access zusätzlich den exakten Repräsentationskontext "
|
||||||
|
"auswählen, bevor daraus Befugnis entsteht. Quell- und abgeleitete Zuweisungen müssen aktuell, aktiv, mandantenlokal und "
|
||||||
|
"funktionskompatibel bleiben. Der Untereinheitenbereich erweitert die organisatorische Reichweite. Deaktivierung und Ablauf "
|
||||||
|
"bewahren die Herkunft, entfernen die Zuweisung aber aus der wirksamen Auflösung. Entscheidungen zu gesteuerten Anträgen "
|
||||||
|
"und Erteilungen bewahren handelnde Person, Richtlinie, Workflow-Revision, Kommentare und Nachweise. Delegierte Befugnis "
|
||||||
|
"wird über die vollständige Quellkette gegen aktuelle Tiefen- und Gültigkeitsgrenzen geprüft. Eine konfigurierte Frist pro "
|
||||||
|
"Schritt erzeugt einen sichtbaren eskalierten Zustand und eine exakte Zielfunktionsroute; sie ersetzt oder protokolliert "
|
||||||
|
"niemals automatisch eine freigebende Person. Eine Notfallüberschreibung ist nicht der Normalweg und benötigt einen "
|
||||||
|
"ausdrücklichen Grund. Eine IDM-Zuweisung allein gewährt niemals Anwendungsberechtigungen; Access verlangt eine "
|
||||||
|
"ausdrückliche Zuordnung."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "reference",
|
"kind": "reference",
|
||||||
"help_contexts": [
|
"help_contexts": [
|
||||||
@@ -878,16 +1033,43 @@ manifest = ModuleManifest(
|
|||||||
maturity="vertical_slice",
|
maturity="vertical_slice",
|
||||||
documentation_ref="docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md",
|
documentation_ref="docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md",
|
||||||
test_ref="tests/test_assignment_workflow.py",
|
test_ref="tests/test_assignment_workflow.py",
|
||||||
known_limits=("SCIM provisioning is a deterministic preview; governed plan execution is not implemented yet.",),
|
known_limits=(
|
||||||
|
"SCIM provisioning is a deterministic preview; governed plan execution is not implemented yet.",
|
||||||
|
),
|
||||||
supported_authority_modes=("external_authoritative", "external_mirror"),
|
supported_authority_modes=("external_authoritative", "external_mirror"),
|
||||||
owned_concepts=("function assignment", "assignment delegation", "acting-for assignment", "assignment request", "typed group", "identity relationship"),
|
owned_concepts=(
|
||||||
non_owned_concepts=("identity", "organization function", "application role", "workflow runtime"),
|
"function assignment",
|
||||||
recovery_docs=("docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md", "docs/TYPED_RELATIONSHIPS.md", "docs/SCIM_PROVISIONING.md"),
|
"assignment delegation",
|
||||||
security_docs=("docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md", "docs/TYPED_RELATIONSHIPS.md", "docs/SCIM_PROVISIONING.md"),
|
"acting-for assignment",
|
||||||
|
"assignment request",
|
||||||
|
"typed group",
|
||||||
|
"identity relationship",
|
||||||
|
),
|
||||||
|
non_owned_concepts=(
|
||||||
|
"identity",
|
||||||
|
"organization function",
|
||||||
|
"application role",
|
||||||
|
"workflow runtime",
|
||||||
|
),
|
||||||
|
recovery_docs=(
|
||||||
|
"docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md",
|
||||||
|
"docs/TYPED_RELATIONSHIPS.md",
|
||||||
|
"docs/SCIM_PROVISIONING.md",
|
||||||
|
),
|
||||||
|
security_docs=(
|
||||||
|
"docs/FUNCTION_ASSIGNMENT_WORKFLOWS.md",
|
||||||
|
"docs/TYPED_RELATIONSHIPS.md",
|
||||||
|
"docs/SCIM_PROVISIONING.md",
|
||||||
|
),
|
||||||
operations_docs=("README.md", "docs/SCIM_PROVISIONING.md"),
|
operations_docs=("README.md", "docs/SCIM_PROVISIONING.md"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
manifest = with_documentation_structured_translations(
|
||||||
|
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_manifest() -> ModuleManifest:
|
def get_manifest() -> ModuleManifest:
|
||||||
return manifest
|
return manifest
|
||||||
|
|||||||
@@ -7,6 +7,14 @@ from govoplan_idm.backend.api.v1.routes import ORGANIZATION_IDENTITY_READ_SCOPES
|
|||||||
|
|
||||||
|
|
||||||
class IdmInterfaceDocumentationContractTests(unittest.TestCase):
|
class IdmInterfaceDocumentationContractTests(unittest.TestCase):
|
||||||
|
def test_all_static_topics_have_complete_german_content(self) -> None:
|
||||||
|
for topic in manifest.documentation:
|
||||||
|
german = (topic.translations or {}).get("de", {})
|
||||||
|
self.assertEqual({"title", "summary", "body"}, set(german), topic.id)
|
||||||
|
self.assertTrue(
|
||||||
|
all(str(value).strip() for value in german.values()), topic.id
|
||||||
|
)
|
||||||
|
|
||||||
def test_route_and_contributed_action_remain_declared(self) -> None:
|
def test_route_and_contributed_action_remain_declared(self) -> None:
|
||||||
frontend = manifest.frontend
|
frontend = manifest.frontend
|
||||||
self.assertIsNotNone(frontend)
|
self.assertIsNotNone(frontend)
|
||||||
@@ -54,8 +62,13 @@ class IdmInterfaceDocumentationContractTests(unittest.TestCase):
|
|||||||
"idm.typed-groups.action.resolve-memberships",
|
"idm.typed-groups.action.resolve-memberships",
|
||||||
relationships.metadata["help_contexts"],
|
relationships.metadata["help_contexts"],
|
||||||
)
|
)
|
||||||
self.assertIn("Revocation immediately", relationships.metadata["consequences"][2])
|
self.assertIn(
|
||||||
self.assertIn("Access permissions remain unchanged", relationships.metadata["verification"])
|
"Revocation immediately", relationships.metadata["consequences"][2]
|
||||||
|
)
|
||||||
|
self.assertIn(
|
||||||
|
"Access permissions remain unchanged",
|
||||||
|
relationships.metadata["verification"],
|
||||||
|
)
|
||||||
|
|
||||||
def test_relationship_writers_may_use_identity_search_selectors(self) -> None:
|
def test_relationship_writers_may_use_identity_search_selectors(self) -> None:
|
||||||
self.assertIn("idm:relationship:write", ORGANIZATION_IDENTITY_READ_SCOPES)
|
self.assertIn("idm:relationship:write", ORGANIZATION_IDENTITY_READ_SCOPES)
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/idm-webui",
|
"name": "@govoplan/idm-webui",
|
||||||
"version": "0.1.21",
|
"version": "0.1.24",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
@@ -772,7 +772,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
|
|||||||
<option value="full">i18n:govoplan-idm.full.7f021a14</option>
|
<option value="full">i18n:govoplan-idm.full.7f021a14</option>
|
||||||
</select>
|
</select>
|
||||||
</FormField>
|
</FormField>
|
||||||
<FormField label="i18n:govoplan-idm.change_retention_days.4a91f7d3" documentation={IDM_FIELD_DOCUMENTATION}>
|
<FormField label="i18n:govoplan-idm.change_retention_days.4a91f7d3" documentation={IDM_FIELD_DOCUMENTATION} helpContextId="idm.field.retention" helpModuleId="idm">
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
min="0"
|
min="0"
|
||||||
|
|||||||
Reference in New Issue
Block a user