Access Management Clients
Status |
Proposed |
|---|---|
ADR # |
0007 |
Author(s) |
Solid Logix Team |
Sponsor |
HEC/USACE |
Date |
2/2/2026 |
Supersedes |
N/A |
Objective
Document the management applications for CWMS access control, providing administrators with multiple interfaces to manage users, roles, and authorization policies. The management clients comprise a REST API, a web-based user interface, and a command-line interface, all designed to work together as a unified access management solution.
Motivation
Administrative Requirements
The CWMS Data API authorization system requires administrative tooling for:
Managing user access and permissions across multiple offices
Configuring role-based access control for the 7 user personas defined in PWS Exhibit 3
Viewing and auditing authorization policies
Supporting both technical and non-technical administrators
Multiple Interface Requirements
Different administrator personas require different interfaces:
IT Administrators: Prefer CLI for scripting and automation
Security Officers: Require web UI for policy review and audit
Operations Team: Need quick access to user management via web or CLI
User Benefit
Data Administrators
Centralized user and role management
Visual policy viewer for audit and compliance
Multiple interface options based on preference and workflow
IT Operations
CLI for scripting and automation workflows
JSON output format for integration with other tools
Batch operations support
Security and Compliance
Complete audit trail visibility
Policy review capabilities
User access reporting
Design Proposal
Architecture Overview
graph TB
subgraph "Management Clients"
UI[Management UI<br/>React + Vite]
CLI[Management CLI<br/>Commander + Ink]
end
subgraph "Management Layer"
API[Management API<br/>Fastify]
end
subgraph "Backend Services"
CDA[CWMS Data API]
OPA[Policy Engine]
end
subgraph "Data Layer"
DB[(Oracle Database)]
end
UI --> API
CLI --> API
API --> CDA
API --> OPA
CDA --> DB
Data Flow
sequenceDiagram
participant Admin as Administrator
participant Client as Management UI/CLI
participant MgmtAPI as Management API
participant CDA as CWMS Data API
participant DB as Oracle Database
Admin->>Client: Request user list
Client->>MgmtAPI: GET /api/users
MgmtAPI->>CDA: GET /cwms-data/auth/users
CDA->>DB: Query at_sec_cwms_users
DB-->>CDA: User records
CDA-->>MgmtAPI: User data
MgmtAPI-->>Client: Formatted response
Client-->>Admin: Display users
Core Components
1. Management API (management-api)
Technology Stack:
Node.js 24.x runtime
TypeScript 5.x for type safety
Fastify framework for high-performance HTTP handling
Pino for structured logging
Zod for request/response validation
Primary Responsibilities:
Provide RESTful endpoints for user and role management
Aggregate data from CWMS Data API endpoints
Transform and format responses for client consumption
Handle authentication and session management
API Endpoints:
Method |
Endpoint |
Description |
|---|---|---|
GET |
/api/users |
List all users with pagination |
GET |
/api/users/:id |
Get user details by ID |
POST |
/api/users |
Create new user |
PUT |
/api/users/:id |
Update user |
GET |
/api/roles |
List all roles |
GET |
/api/roles/:id |
Get role details |
POST |
/api/roles |
Create new role |
PUT |
/api/roles/:id |
Update role |
GET |
/api/policies |
List authorization policies |
GET |
/api/policies/:id |
Get policy details |
Backend Integration:
The Management API connects to CWMS Data API endpoints rather than accessing Keycloak or the database directly. This design ensures:
Consistent data access through established API patterns
Reuse of existing authentication and authorization logic
Simplified deployment without direct database credentials
2. Management UI (management-ui)
Technology Stack:
React 18.x with functional components and hooks
Vite 6.x for build tooling and development server
TypeScript 5.x for type safety
TanStack Query v5 for server state management
Tailwind CSS 4.x for styling
React Router for navigation
Features:
Feature |
Description |
|---|---|
User List |
Paginated table with search and filter capabilities |
User Detail |
View and edit user information, office assignments, roles |
Role List |
Display all available roles with descriptions |
Role Detail |
View role permissions and assigned users |
Policy Viewer |
Read-only view of OPA policies for audit purposes |
Dashboard |
Summary statistics and recent activity |
Component Architecture:
src/
components/
users/
user-list.tsx
user-detail.tsx
user-form.tsx
roles/
role-list.tsx
role-detail.tsx
policies/
policy-viewer.tsx
common/
data-table.tsx
search-input.tsx
pagination.tsx
hooks/
use-users.ts
use-roles.ts
use-policies.ts
services/
api-client.ts
pages/
users.tsx
roles.tsx
policies.tsx
dashboard.tsx
State Management:
TanStack Query handles all server state with:
Automatic caching and background refetching
Optimistic updates for improved UX
Error handling and retry logic
Request deduplication
3. Management CLI (management-cli)
Technology Stack:
Node.js 24.x runtime
TypeScript 5.x for type safety
Commander.js for command parsing
Ink for terminal UI components
Zod for input validation
Commands:
management-cli users list [--office <office>] [--format <table|json>]
management-cli users get <username> [--format <table|json>]
management-cli roles list [--format <table|json>]
management-cli roles get <role-id> [--format <table|json>]
management-cli policies list [--format <table|json>]
Output Formats:
Table: Human-readable formatted output for terminal use
JSON: Machine-readable output for scripting and automation
Example Output (Table):
Users
-----
Username Office Roles
----------- -------- ---------------------------
m5hectest SWT CWMS Users, TS ID Creator
l2hectest SPK CWMS Users, TS ID Creator
l1hectest SPL (none)
Example Output (JSON):
{
"users": [
{
"username": "m5hectest",
"office": "SWT",
"roles": ["CWMS Users", "TS ID Creator"]
}
]
}
Implementation Approach
Phase 1: Management API Foundation
Implement core Fastify service structure
Create user and role endpoints
Integrate with CWMS Data API
Add request validation and error handling
Deploy as containerized service
Phase 2: Management UI Development
Set up React + Vite project structure
Implement user list and detail views
Implement role list and detail views
Add policy viewer component
Integrate TanStack Query for data fetching
Deploy as static assets or containerized service
Phase 3: Management CLI Development
Create Commander-based CLI structure
Implement user commands
Implement role commands
Add output format options
Package as standalone executable
Alternatives Considered
Option 1: Direct Database Access
Pros: Simpler architecture, fewer services
Cons: Bypasses API authorization, requires database credentials in multiple places
Rejected: Violates principle of API-first architecture
Option 2: Keycloak Admin UI Only
Pros: No custom development required
Cons: Limited to Keycloak capabilities, cannot show CWMS-specific data
Rejected: Does not support CWMS-specific user attributes and office assignments
Option 3: Management Clients via CWMS Data API (Selected)
Pros: Consistent access patterns, reuses existing authorization, single source of truth
Cons: Requires Management API as intermediate layer
Selected: Best alignment with API-first architecture and existing patterns
Performance Implications
Management API:
Response time target: <100ms for list operations, <50ms for single record
Caching strategy: In-memory cache for frequently accessed data (roles, offices)
Connection pooling to CWMS Data API
Management UI:
Initial load: <2 seconds
Subsequent navigation: <500ms with client-side routing
TanStack Query stale time: 5 minutes for user/role data
Management CLI:
Command execution: <2 seconds for list operations
Startup time: <500ms with bundled executable
Dependencies
New Components:
Management API service (Fastify)
Management UI application (React + Vite)
Management CLI tool (Commander + Ink)
Existing Integration:
CWMS Data API - Backend data source
Authorization Proxy - Authentication passthrough
Redis Cache - Session storage (optional)
Development Dependencies:
Vitest for unit testing
Playwright for E2E testing (UI)
Supertest for API testing
Engineering Impact
Deployment:
Management API: Docker container (~150MB)
Management UI: Static assets (~5MB) or Nginx container
Management CLI: Single executable (~200KB)
Maintenance:
Shared codebase in Nx monorepo
Common TypeScript types across all clients
Unified testing and CI/CD pipeline
Platforms and Environments
Local Development:
Podman/Docker containers
Hot-reloading for UI and API development
All services in docker-compose.podman.yml
Service Ports:
Service |
Port |
|---|---|
Management UI |
4200 |
Management API |
3002 |
Management CLI |
N/A (local executable) |
Best Practices
Security:
All requests authenticated via JWT
Role-based access to management functions
Audit logging for all write operations
No direct database credentials in clients
User Experience:
Consistent design language across UI and CLI
Helpful error messages with suggested actions
Confirmation dialogs for destructive operations
Keyboard navigation support in UI
Code Quality:
TypeScript strict mode enabled
Shared types between API and clients
Comprehensive test coverage
Automated linting and formatting
Compatibility
Backward Compatibility:
Management clients are new components, no backward compatibility concerns
CWMS Data API endpoints remain unchanged
Forward Compatibility:
API versioning support (/api/v1/users)
Extensible command structure in CLI
Component-based UI for easy feature additions
Implementation Status
Component |
Status |
Notes |
|---|---|---|
Management API |
In Progress |
Refactoring to use CWMS Data API endpoints |
Management UI |
Development |
React 18 + Vite 6 + TanStack Query v5 |
Management CLI |
Development |
Commander + Ink, builds to 166KB executable |
Success Criteria
Functional Requirements
Support user CRUD operations through all three interfaces
Support role viewing and assignment
Provide policy viewer for audit purposes
Consistent data across all interfaces
Performance Requirements
API response time: <100ms for list operations
UI initial load: <2 seconds
CLI command execution: <2 seconds
Usability Requirements
CLI commands follow standard Unix conventions
UI follows accessibility guidelines (WCAG 2.1 AA)
Clear error messages with actionable guidance
Conclusion
The Access Management Clients provide a comprehensive suite of tools for administering CWMS access control. By offering three distinct interfaces (API, UI, CLI), the solution accommodates different administrator workflows and preferences while maintaining consistency through a unified backend.
Key Benefits
Flexibility: Multiple interface options for different use cases
Consistency: All clients share the same backend and data model
Maintainability: Shared codebase in Nx monorepo with common types
Security: All access flows through authenticated API endpoints