Sync wiki from project files

2026-07-28 15:08:17 +02:00
parent dc937867ba
commit 181bceb8f0
3 changed files with 300 additions and 56 deletions

@@ -1,4 +1,4 @@
<!-- codex-wiki-sync:e3ef9f104ebfdaeff1f012ec --> <!-- codex-wiki-sync:a5d61cd09236e01e58b2088d -->
> Mirrored from `/mnt/DATA/git/govoplan-access/README.md`. > Mirrored from `/mnt/DATA/git/govoplan-access/README.md`.
> Origin: `repository`. > Origin: `repository`.
@@ -7,32 +7,46 @@
--- ---
# GovOPlaN Access # GovOPlaN Access
<!-- govoplan-repository-type:start -->
**Repository type:** module (platform).
<!-- govoplan-repository-type:end -->
`govoplan-access` is the platform module for GovOPlaN identity, `govoplan-access` is the platform module for GovOPlaN identity,
authentication, sessions, API keys, RBAC, groups, users, and access authentication, sessions, API keys, RBAC, groups, users, and access
administration. administration.
The repository contains the extracted access seed implementation under The repository contains the extracted access seed implementation under
`src/govoplan_access/backend`. Session, API-key, and password helper services, `src/govoplan_access/backend`. Session, API-key, and password helper services,
interactive auth routes, and administration routers are owned here. The public interactive auth routes, and administration routers are owned here. Access
FastAPI request dependency API is exported from `govoplan_access.auth`; modules still exports `govoplan_access.auth` for compatibility, but sibling modules
must not import the backend dependency module directly. Access-side admin should import the core `govoplan_core.auth` facade so auth can become a
service helpers remain provider-neutral capability. Modules must not import the backend dependency
module directly. Access-side admin service helpers remain
here for users, groups, roles, system accounts, sessions, API keys, tenant here for users, groups, roles, system accounts, sessions, API keys, tenant
access enforcement, admin/audit lookup capabilities, tenant owner access enforcement, admin/audit lookup capabilities, tenant owner
provisioning, and governance-template materialization into access-owned groups provisioning, and governance-template materialization into access-owned groups
and roles. Governance-template metadata CRUD lives in `govoplan-admin`. The and roles. The module also enforces narrowly declared managed
`RoleTemplate.default_authenticated` baselines. Their explicit permissions are
derived from the active manifest set for every authenticated tenant member,
without writing assignments during an authorization read. The optional role
row is a non-assignable administration projection, not the source of the
automatic grant. Domain permissions and resource policy remain separate checks.
Governance-template metadata CRUD lives in `govoplan-admin`. The
transitional administration WebUI route shell and transitional administration WebUI route shell and
access-owned panels live under `webui/src` as `@govoplan/access-webui`. Generic access-owned panels live under `webui/src` as `@govoplan/access-webui`. Generic
system administration panels are contributed by `@govoplan/admin-webui` through system administration panels are contributed by `@govoplan/admin-webui` through
core's `admin.sections` UI capability. Live access ORM models are defined here core's `admin.sections` UI capability. Live access ORM models are defined here
with `access_*` table names; tenant records live in `govoplan-tenancy`, with `access_*` table names. Access stores current scope identifiers in
governance templates in `govoplan-admin`, audit logs in `govoplan-audit`, and `tenant_id` columns but does not hard-depend on the tenancy module package.
system settings in `govoplan-core`. The current access boundary is documented Tenancy-specific tenant administration and tenant resolver behavior live in
in: `govoplan-tenancy`; governance templates in `govoplan-admin`, audit logs in
`govoplan-audit`, and system settings in `govoplan-core`. The current access
boundary is documented in:
- `/mnt/DATA/git/govoplan-core/docs/ACCESS_RBAC_MODEL.md` - `/mnt/DATA/git/govoplan-core/docs/ACCESS_RBAC_MODEL.md`
- `/mnt/DATA/git/govoplan-core/docs/MODULE_ARCHITECTURE.md` - `/mnt/DATA/git/govoplan-core/docs/MODULE_ARCHITECTURE.md`
- `docs/ACCESS_MODULE_BOUNDARY.md` - `docs/ACCESS_MODULE_BOUNDARY.md`
- `docs/IDENTITY_ACCOUNT_FUNCTION_MODEL.md`
- `docs/OPENDESK_IDENTITY_BOUNDARY.md` - `docs/OPENDESK_IDENTITY_BOUNDARY.md`
## Initial Ownership ## Initial Ownership
@@ -44,13 +58,17 @@ This module will own:
- API keys - API keys
- legacy administration route contribution during the transition - legacy administration route contribution during the transition
- tenant-local users - tenant-local users
- identity-to-account projection for explainable access decisions
- organization-bound functions and function assignments
- explicit delegation and acting-in-place facts
- groups and memberships - groups and memberships
- roles and role assignments - roles and role assignments
- principal resolution - principal resolution
- permission evaluation - permission evaluation
- access administration backend routes - access administration backend routes
- access administration WebUI route contributions - access administration WebUI route contributions
- published FastAPI auth dependency API at `govoplan_access.auth` - compatibility FastAPI auth dependency API at `govoplan_access.auth`
- provider-facing auth facade consumed by sibling modules at `govoplan_core.auth`
- access administration, tenant provisioning, and governance materializer - access administration, tenant provisioning, and governance materializer
capabilities capabilities
- access-owned migrations - access-owned migrations
@@ -58,20 +76,29 @@ This module will own:
The governance-template routes under `/admin/system/governance-templates` are The governance-template routes under `/admin/system/governance-templates` are
contributed by `govoplan-admin`; access must not register those routes. contributed by `govoplan-admin`; access must not register those routes.
`govoplan-access` depends on `govoplan-tenancy`; the registry loads tenancy `govoplan-access` treats `govoplan-tenancy` as optional. Access can run in the
before access for authenticated platform composition. single-scope compatibility mode used by the core/access baseline, and tenancy
adds tenant administration plus tenant resolver behavior when installed.
## Principal Context ## Principal Context
The stable principal DTO is `govoplan_core.core.access.PrincipalRef`. Access The stable principal DTO is `govoplan_core.core.access.PrincipalRef`. Access
resolves sessions, API keys, and future service accounts into that DTO and resolves sessions, API keys, and future service accounts into that DTO and
serializes it as `principal` in auth API responses. Feature modules should use serializes it as `principal` in auth API responses. Feature modules should use
that DTO, primitive IDs, or the published `govoplan_access.auth` dependency API that DTO, primitive IDs, or the core `govoplan_core.auth` dependency facade
instead of importing access ORM models or backend dependency internals. instead of importing access ORM models or backend dependency internals.
The detailed module boundary and serialization fields are documented in The detailed module boundary and serialization fields are documented in
[docs/ACCESS_MODULE_BOUNDARY.md](docs/ACCESS_MODULE_BOUNDARY.md). [docs/ACCESS_MODULE_BOUNDARY.md](docs/ACCESS_MODULE_BOUNDARY.md).
For scheduled and event-driven work, Access provides
`auth.automationPrincipalProvider`. Automation records store only an owner
account/membership reference and an explicit least-privilege scope grant, not
a session or API token. At delivery time Access rebuilds the principal from
current roles, groups, functions, and delegations and intersects that
authorization with the stored grant. Missing, inactive, moved, or
under-authorized owners fail closed before module work starts.
## WebUI Package ## WebUI Package
The repository root and `webui/` directory both expose the package The repository root and `webui/` directory both expose the package
@@ -96,7 +123,7 @@ available:
```bash ```bash
cd /mnt/DATA/git/govoplan-core cd /mnt/DATA/git/govoplan-core
./scripts/gitea-sync-labels.py --root /mnt/DATA/git/govoplan-access --apply /mnt/DATA/git/govoplan/tools/gitea/gitea-sync-labels.py --root /mnt/DATA/git/govoplan-access --apply
``` ```
## Development Install ## Development Install
@@ -107,3 +134,21 @@ From the core checkout:
cd /mnt/DATA/git/govoplan-core cd /mnt/DATA/git/govoplan-core
./.venv/bin/python -m pip install -e ../govoplan-access ./.venv/bin/python -m pip install -e ../govoplan-access
``` ```
## Login Throttling
Interactive password login is throttled by normalized global login identity and by
the directly connected client address. The deployment defaults are 10 identity
failures and 100 client failures in a 15-minute window. Counters use
`REDIS_URL` when Redis is reachable, allowing all API workers to share the same
limits. Local development and Redis outages fall back automatically to a
bounded, process-local counter; authentication remains available, but limits
then apply per API process.
The deployment settings are `AUTH_LOGIN_THROTTLE_ENABLED`,
`AUTH_LOGIN_THROTTLE_IDENTITY_LIMIT`, `AUTH_LOGIN_THROTTLE_CLIENT_LIMIT`,
`AUTH_LOGIN_THROTTLE_WINDOW_SECONDS`, and
`AUTH_LOGIN_THROTTLE_REDIS_RETRY_SECONDS`. Client-supplied forwarding headers
are not trusted for throttling. A reverse proxy should pass the real peer
address only through the platform's separately configured trusted-proxy
boundary.

@@ -1,4 +1,4 @@
<!-- codex-wiki-sync:2e63e88b3a64a33346d219fe --> <!-- codex-wiki-sync:37abcafc257c299b2f6f19f2 -->
> Mirrored from `/mnt/DATA/git/govoplan-access/docs/ACCESS_MODULE_BOUNDARY.md`. > Mirrored from `/mnt/DATA/git/govoplan-access/docs/ACCESS_MODULE_BOUNDARY.md`.
> Origin: `repository`. > Origin: `repository`.
@@ -20,8 +20,12 @@ contracts.
- interactive authentication routes and session lifecycle - interactive authentication routes and session lifecycle
- API-key creation, verification, revocation, and scope delegation - API-key creation, verification, revocation, and scope delegation
- tenant-local users, memberships, groups, roles, and role assignments - tenant-local users, memberships, groups, roles, and role assignments
- identity-to-account projection used for explainability
- organization-bound functions, function assignments, and delegation facts
- principal resolution and request authentication dependencies - principal resolution and request authentication dependencies
- permission evaluation for access-owned scopes and legacy access aliases - permission evaluation for access-owned scopes and legacy access aliases
- access-decision explain output with identity/account/function/role/right
provenance
- access administration backend routes for users, groups, roles, system - access administration backend routes for users, groups, roles, system
accounts, sessions, and API keys accounts, sessions, and API keys
- access administration WebUI route contribution for `/admin` - access administration WebUI route contribution for `/admin`
@@ -45,16 +49,48 @@ importing access internals:
- database engine/session lifecycle and migration orchestration - database engine/session lifecycle and migration orchestration
- capability registry and capability names in `govoplan_core.core.access` - capability registry and capability names in `govoplan_core.core.access`
- access DTO/protocol contracts such as `PrincipalRef`, `AccountRef`, - access DTO/protocol contracts such as `PrincipalRef`, `AccountRef`,
`UserRef`, `GroupRef`, `RoleRef`, `PrincipalResolver`, `UserRef`, `GroupRef`, `RoleRef`, `IdentityRef`,
`AccessDirectory`, `PermissionEvaluator`, `TenantAccessProvisioner`, `OrganizationUnitRef`, `FunctionRef`, `FunctionAssignmentRef`,
`AccessAdministration`, and `AccessGovernanceMaterializer` `FunctionDelegationRef`, `AccessDecisionProvenance`,
`ApiPrincipalProvider`, `TenantContextSwitcher`, `PrincipalResolver`,
`AccessDirectory`, `AccessSemanticDirectory`, `PermissionEvaluator`,
`AccessExplanationService`, `TenantAccessProvisioner`,
`AccessAdministration`, and
`AccessGovernanceMaterializer`
- health, platform metadata, and module startup ordering - health, platform metadata, and module startup ordering
- generic security helpers that are not access-state semantics, such as - generic security helpers that are not access-state semantics, such as
secret encryption and UTC time helpers secret encryption and UTC time helpers
Feature modules should depend on these kernel contracts or the published Feature modules should depend on these kernel contracts or the core
`govoplan_access.auth` request dependency API, not on access ORM models or `govoplan_core.auth` request dependency facade, not on access ORM models or
`govoplan_access.backend.*` implementation internals. `govoplan_access.backend.*` implementation internals. The access package still
exports `govoplan_access.auth` for compatibility, but new routers should use
the core facade so auth can move behind provider-neutral capabilities.
Access declares tenancy as an optional module integration. It uses the
core-owned `core_scopes` table as the scope table, but it must not import
`govoplan_tenancy` or require the tenancy package to start.
## Core-Only Startup Contract
A core-only installation must be able to start far enough to expose process
health, module metadata, and the unauthenticated shell needed for installation
or recovery work. It is not a usable authenticated product installation.
Authenticated product use requires the `access` module or another module that
provides the same kernel auth capabilities:
- `auth.apiPrincipalProvider`
- `auth.principalResolver`
- `auth.permissionEvaluator`
- `auth.tenantContextSwitcher`
Access contributes the default implementations for those capabilities plus the
interactive `/api/v1/auth/*` routes. Product modules should express auth needs
as required capabilities or route permission requirements instead of importing
access internals. Runtime configurations that intentionally omit access should
hide authenticated navigation and return capability errors for authenticated
product routes rather than failing process startup.
## Principal Context Contract ## Principal Context Contract
@@ -66,21 +102,64 @@ contracts. New module code should pass around `PrincipalRef` or primitive IDs.
`PrincipalRef.to_dict()` is the canonical API/WebUI serialization shape: `PrincipalRef.to_dict()` is the canonical API/WebUI serialization shape:
- `account_id`, `membership_id`, and `tenant_id` - `account_id`, `membership_id`, and `tenant_id`
- sorted `scopes` and `group_ids` - optional `identity_id`
- sorted `scopes`, `group_ids`, `role_ids`, `function_assignment_ids`, and
`delegation_ids`
- `auth_method` plus optional `session_id`, `api_key_id`, or - `auth_method` plus optional `session_id`, `api_key_id`, or
`service_account_id` `service_account_id`
- optional `acting_for_account_id` for acting-in-place flows
- optional display fields `email` and `display_name` - optional display fields `email` and `display_name`
`/api/v1/auth/me`, `/api/v1/auth/login`, profile refreshes, and tenant switches `govoplan_core.auth` is now backed by the `auth.apiPrincipalProvider`
include this payload as `principal` alongside the existing compatibility capability. The access module provides that capability; core no longer imports
fields. Modules that need current user context should prefer access auth dependencies directly. `/api/v1/auth/me`, `/api/v1/auth/login`,
`auth.principal`/`AuthInfo.principal` in the WebUI and profile refreshes, and tenant switches include this payload as `principal`
alongside the existing compatibility fields. Modules that need current user
context should prefer `auth.principal`/`AuthInfo.principal` in the WebUI and
`principal.to_platform_principal()` in backend request handlers. `principal.to_platform_principal()` in backend request handlers.
Interactive tenant context switching is exposed through
`auth.tenantContextSwitcher`. The existing `/api/v1/auth/switch-tenant` route
remains for API compatibility; `govoplan-tenancy` also contributes
`/api/v1/tenancy/switch-tenant`. Both delegate to the same access-owned session
switch behavior. Lifecycle code must use the capability instead of importing
`govoplan_access.backend.security.sessions`.
## Identity And Function Boundary
The full semantic model is documented in
[IDENTITY_ACCOUNT_FUNCTION_MODEL.md](IDENTITY_ACCOUNT_FUNCTION_MODEL.md).
In short:
- `govoplan-idm` imports and previews external identity and organization facts
from IDM systems.
- `govoplan-identity` owns canonical identities and identity/account links.
- `govoplan-organizations` owns canonical organization units, functions, and
account-held function assignments.
- `govoplan-access` owns the authorization projection that maps organization
and identity facts to roles, rights, delegation enforcement, and explainable
permission decisions.
Function assignments are account-held and organization-scoped. They can apply
only to the selected organization unit or to that unit and all subunits.
Delegation and acting-in-place must remain explicit facts with audit
provenance; modules must not infer either from plain group membership.
The backend foundation exposes these administration routes:
- `/api/v1/admin/identities`
- `/api/v1/admin/organization-units`
- `/api/v1/admin/functions`
- `/api/v1/admin/function-assignments`
- `/api/v1/admin/function-delegations`
Dedicated WebUI management panels and explicit acting-in-place context
selection are still follow-up work on top of these routes.
## Removed Compatibility Paths ## Removed Compatibility Paths
These legacy imports were removed from core. Use access-owned modules, the These legacy imports were removed from core. Use access-owned modules, the
public `govoplan_access.auth` request dependency API, or kernel capabilities core `govoplan_core.auth` request dependency facade, or kernel capabilities
instead: instead:
- `govoplan_core.security.api_keys` - `govoplan_core.security.api_keys`

@@ -1,4 +1,4 @@
<!-- codex-wiki-sync:563b1b7d950e185399744df6 --> <!-- codex-wiki-sync:a5376f0c4e41273ff1949a03 -->
> Mirrored from `/mnt/DATA/git/govoplan-access/docs/IDENTITY_ACCOUNT_FUNCTION_MODEL.md`. > Mirrored from `/mnt/DATA/git/govoplan-access/docs/IDENTITY_ACCOUNT_FUNCTION_MODEL.md`.
> Origin: `repository`. > Origin: `repository`.
@@ -7,58 +7,178 @@
--- ---
# Identity, Account, Function, Role, And Right Model # Identity, Account, Function, Role, And Right Model
GovOPlaN access should distinguish identity facts from organizational GovOPlaN access distinguishes identity facts, organizational responsibility,
responsibility and authorization decisions. and authorization decisions. This is groundwork for postboxes, workflows,
service directories, portals, delegation, and audit review.
Directory services, identity providers, and IDM systems may authenticate people Directory services, identity providers, and IDM systems can authenticate people
and provide membership facts. GovOPlaN access owns the platform projection used and provide external facts. GovOPlaN access owns the normalized runtime
for sessions, tenant membership, groups, functions, roles, delegation, and projection used for sessions, tenant memberships, groups, functions, roles,
permission decisions. delegations, and permission decisions.
## Semantic Layers ## Semantic Layers
- Identity: the real person, service, or external subject. - Identity: the real person, service, or external subject. An identity can have
- Account: the login or technical account used to authenticate. multiple accounts, for example a normal account and a privileged
- Tenant membership: the person's participation in a tenant. administration account.
- Account: the login or technical account used to authenticate. Access
decisions are account-based because the account is the acting credential.
- Tenant membership: the account's participation in a tenant.
- Organization unit: the administrative unit where responsibility applies. - Organization unit: the administrative unit where responsibility applies.
- Function: a responsibility held in an organization unit, such as case clerk, Organization units are hierarchical; access must know when a function applies
intake desk, treasurer, or committee secretary. only to one unit or to that unit and all subunits.
- Function: a named responsibility held by an account in an organization unit,
such as case clerk, intake desk, treasurer, dean's office assistant, or
committee secretary. A function can map to one or more access roles.
- Role: a permission bundle or workflow authority attached to a function, - Role: a permission bundle or workflow authority attached to a function,
group, or explicit assignment. group, or explicit assignment.
- Right: the concrete scope or action permission evaluated at runtime. - Right: the concrete scope or action permission evaluated at runtime.
The UI and API should avoid collapsing these layers into one generic group The UI and API must not collapse these layers into a generic group concept.
concept. Directory groups can feed mappings, but they should not silently become Directory groups can feed mappings, but they must not silently become business
business authority without a governed mapping rule. authority without a governed mapping rule.
## Boundary ## Organizational Function Scope
Access owns: A function is meaningful only with organizational scope. The stable contract
therefore separates:
- account and tenant membership projection - `FunctionRef`: the organization-bound function definition, including tenant,
organization unit, role mappings, and delegation policy flags.
- `FunctionAssignmentRef`: the account-held assignment for that function,
including identity provenance and whether the assignment applies to all
subunits of the function's organization unit.
The assignment is the runtime authority. A role mapped to a function does not
grant rights until an account has an active assignment for that function.
Example:
- Identity `Anna Becker` owns accounts `anna` and `anna-admin`.
- Account `anna` has function `Registry Clerk` in organization unit
`Student Registry`.
- The assignment has `applies_to_subunits = true`, so the same function applies
to subordinate registry offices unless policy narrows it.
- The function maps to role `registry.case_editor`, which grants rights such as
`cases:case:update`.
## Delegation And Acting In Place
Functions can be delegated only if the function policy permits it. GovOPlaN
distinguishes two delegation modes:
- Delegation: the delegate acts as themself, with provenance showing the
delegated function assignment.
- Acting in place: the actor performs an action in another holder's function
context. Audit and explain responses must show both the real actor account
and the account being represented.
Both modes should be time-bound, revocable, auditable, and visible in access
explain output. Module code must not infer delegation from ordinary group
membership.
## IDM Boundary
`govoplan-idm` owns synchronization with external IDM systems: SCIM, LDAP,
SAML/OIDC claims, directory attributes, preview, rollback, and mapping import.
It does not own GovOPlaN's internal identity, organization, function, role, or
permission evaluation tables.
`govoplan-identity` owns canonical identity records and identity/account links.
`govoplan-organizations` owns canonical organization units, functions, and
function assignments. During the transition, access keeps a security projection
of those concepts for compatibility and authorization, but new integrations
should target the identity and organization capabilities first.
`govoplan-access` owns the platform projection created from those mappings:
- accounts and tenant membership projection
- identity-to-account links used for explainability
- groups, roles, function assignments, and delegation facts - groups, roles, function assignments, and delegation facts
- permission decisions and explain responses - permission decisions and explain responses
- identity and membership change events - access-owned identity and membership change events
- SCIM/OIDC/SAML/LDAP mapping effects when implemented - mapping effects after an IDM import is accepted
Access does not own: Access does not own:
- mailboxes, calendars, files, cases, tasks, or postboxes - mailboxes, calendars, files, cases, tasks, postboxes, or other module data
- canonical organization structure once `govoplan-organizations` is enabled
- canonical identity records once `govoplan-identity` is enabled
- module-specific ACL records beyond stable principal/group/role references - module-specific ACL records beyond stable principal/group/role references
- external provider internals except where they mutate access-owned state - external provider internals except where they mutate access-owned state
## Kernel Contracts
The stable DTO and protocol surface lives in
`govoplan_core.core.access`. The current groundwork adds:
- `IdentityRef`
- `OrganizationUnitRef`
- `FunctionRef`
- `FunctionAssignmentRef`
- `FunctionDelegationRef`
- `AccessDecisionProvenance`
- `AccessSemanticDirectory`
- `AccessExplanationService`
Feature modules should consume those contracts instead of importing access ORM
models. Storage, migration, and admin UI work can evolve behind the contract
without changing module integrations.
## Required Explainability ## Required Explainability
Access decisions should be explainable in concrete terms: Access decisions must be explainable in concrete terms:
- actor identity/account - actor identity and account
- tenant membership - tenant membership
- organization unit - organization unit
- function assignment or group membership - function assignment or group membership
- role source - role source
- permission/right checked - permission or right checked
- delegation or system-actor context - delegation or acting-in-place context
- policy or lock that changed the result - policy, lock, or maintenance state that changed the result
This shape is required for postbox role access, workflow actions, service This shape is required for role-bound postboxes, workflow authorization,
directory personalization, delegated administration, and audit review. service directory personalization, delegated administration, and audit review.
## Consumer Expectations
- Postbox can grant access to a role-bound or function-bound postbox without
tying the postbox to a specific login account.
- Portal/service directory can show services relevant to a user's current
organization functions and tenant membership.
- Workflow can ask whether the current account can act in a function context
for a given organization unit.
- Audit can show who acted, with which account, under which function, and
whether delegation or acting-in-place was involved.
## Implementation Sequence
Implemented backend foundation:
- Kernel DTOs/protocols are covered by focused contract tests.
- Access-owned storage exists for identities, account links, organization
units, functions, function-role mappings, function assignments, and function
delegations.
- Admin APIs exist under `/api/v1/admin/identities`,
`/api/v1/admin/organization-units`, `/api/v1/admin/functions`,
`/api/v1/admin/function-assignments`, and
`/api/v1/admin/function-delegations`.
- `PrincipalRef` population includes identity, role, function assignment, and
delegation identifiers when those facts exist.
- The access manifest registers `access.semanticDirectory` and
`access.explanation` capabilities.
Remaining rollout:
1. Move canonical identity and organization reads to `identity.directory` and
`organizations.directory`, keeping access-owned rows as a compatibility
projection until migration is complete.
2. Add dedicated WebUI management panels for identities, organization units,
functions, assignments, and delegations.
3. Add explicit acting-in-place context selection; `act_in_place` delegation
facts are stored now but do not silently grant permissions without a selected
acting context.
4. Retrofit postbox, workflow, portal, and audit consumers to use identity,
organization, and access explanation capabilities rather than local access
assumptions.