# Component Diagram The CWMS Access Management system consists of several interconnected components that work together to provide authorization services. ## System Component Diagram ```mermaid graph TB subgraph External client[Client Application] end subgraph Access Management Layer proxy[Authorization Proxy] opa[Open Policy Agent] redis[Redis Cache] mgmt_ui[Management UI] mgmt_api[Management API] end subgraph Identity Layer keycloak[Keycloak] end subgraph Data Layer cda[CWMS Data API] db[(Oracle Database)] end client --> proxy proxy --> opa proxy --> redis proxy --> cda proxy --> keycloak cda --> keycloak cda --> db mgmt_ui --> mgmt_api mgmt_api --> opa mgmt_api --> keycloak ``` ## Component Details ### Authorization Proxy The authorization proxy is the entry point for all client requests to the CWMS Data API. ```mermaid graph LR subgraph Authorization Proxy router[Request Router] jwt[JWT Parser] cache[Cache Client] policy[Policy Client] context[Context Builder] forward[Request Forwarder] end router --> jwt jwt --> cache cache --> policy policy --> context context --> forward ``` | Subcomponent | Responsibility | |--------------|----------------| | Request Router | Routes incoming requests based on whitelist configuration | | JWT Parser | Extracts user identity from JWT tokens | | Cache Client | Interfaces with Redis for user context caching | | Policy Client | Communicates with OPA for policy evaluation | | Context Builder | Constructs the x-cwms-auth-context header | | Request Forwarder | Forwards authorized requests to the backend API | ### Open Policy Agent OPA provides policy-based authorization decisions using Rego policies. ```mermaid graph TB subgraph OPA engine[Policy Engine] policies[Policy Bundle] end subgraph Policies main[cwms_authz.rego] personas[Persona Policies] helpers[Helper Functions] end engine --> policies policies --> main main --> personas main --> helpers ``` Policy structure: | Policy File | Purpose | |-------------|---------| | cwms_authz.rego | Main orchestrator policy | | personas/public.rego | Anonymous access rules | | personas/dam_operator.rego | Operational staff rules | | personas/water_manager.rego | Management staff rules | | personas/data_manager.rego | Regional manager rules | | personas/automated_collector.rego | Data collection system rules | | personas/automated_processor.rego | Data processing system rules | | personas/external_cooperator.rego | External partner rules | | helpers/offices.rego | Office metadata and relationships | | helpers/time_rules.rego | Embargo and time window rules | ### Redis Cache Redis stores user context to reduce database queries and improve response times. | Configuration | Value | |---------------|-------| | Key Format | `user:context:{username}` | | TTL | 1800 seconds (30 minutes) | | Max Memory | 256 MB | | Eviction Policy | allkeys-lru | | Persistence | AOF (append-only file) | ### CWMS Data API The Java backend API provides data access with authorization filtering. ```mermaid graph TB subgraph CWMS Data API endpoints[REST Endpoints] filter[Authorization Filter] helper[AuthorizationFilterHelper] jooq[JOOQ Query Builder] end subgraph Database Access db[(Oracle Database)] end endpoints --> filter filter --> helper helper --> jooq jooq --> db ``` | Component | Responsibility | |-----------|----------------| | REST Endpoints | Handle HTTP requests for various data types | | Authorization Filter | Intercepts requests to extract auth context | | AuthorizationFilterHelper | Parses header and generates SQL conditions | | JOOQ Query Builder | Constructs filtered SQL queries | ### Keycloak Keycloak provides identity management and authentication services. | Feature | Usage | |---------|-------| | User Management | Stores user credentials and attributes | | JWT Issuance | Issues tokens upon successful authentication | | JWKS Endpoint | Provides public keys for token validation | | Realm Configuration | Defines client applications and roles | ### Management Components The management UI and API provide administrative interfaces for the access management system. | Component | Technology | Port | Purpose | |-----------|------------|------|---------| | Management UI | React 18, Vite, Tailwind | 4200 | Web-based policy management | | Management API | Node.js, Fastify | 3002 | Backend for management operations | ## Network Topology All components communicate over a shared container network. ```mermaid graph TB subgraph cwmsdb_net proxy[Authorization Proxy
Port 3001] opa[OPA
Port 8181] redis[Redis
Port 6379] mgmt_ui[Management UI
Port 4200] mgmt_api[Management API
Port 3002] cda[CWMS Data API
Port 7001] keycloak[Keycloak
Port 8080] db[Oracle Database
Port 1521] end proxy --> opa proxy --> redis proxy --> cda mgmt_ui --> mgmt_api mgmt_api --> opa mgmt_api --> keycloak cda --> db cda --> keycloak ``` ## Data Flow Summary | Flow | Path | Data | |------|------|------| | Client Request | Client to Proxy | JWT token, HTTP request | | Context Lookup | Proxy to Redis | Username key | | Profile Request | Proxy to API | JWT token | | Policy Check | Proxy to OPA | User context, request details | | Data Request | Proxy to API | Auth context header, original request | | Database Query | API to Oracle | Filtered SQL query | ## Dependency Graph ```mermaid graph TD proxy[Authorization Proxy] opa[OPA] redis[Redis] cda[CWMS Data API] keycloak[Keycloak] db[Oracle Database] mgmt_ui[Management UI] mgmt_api[Management API] proxy --> opa proxy --> redis proxy --> cda cda --> keycloak cda --> db mgmt_ui --> mgmt_api mgmt_api --> opa mgmt_api --> keycloak ``` Startup order: 1. Oracle Database 2. Keycloak (depends on database for persistence) 3. Redis (no dependencies) 4. OPA (no dependencies) 5. CWMS Data API (depends on database and Keycloak) 6. Authorization Proxy (depends on Redis, OPA, and CWMS Data API) 7. Management API (depends on OPA and Keycloak) 8. Management UI (depends on Management API)