6.8 KiB
6.8 KiB
🔐 ComplyCore Authentication & Authorization Design
Component: Identity & Access Management (IAM)
Version: v1.0
Last Updated: 2024-07-11
Owner: Kell Engineering
✅ Overview
ComplyCore uses a multi-tenant, RBAC-enforced identity system built on PostgreSQL with Supabase Auth. All user and system access is governed by:
- Tenant isolation via Row-Level Security (RLS)
- Role-Based Access Control (RBAC) via ENUM roles
- Session-scoped variables (
set_config()) instead of legacy JWT hooks - Support for both human users and non-person entities (NPEs)
- Audit logging for access, evaluation, and data modification events
🧱 Database Entity Model
erDiagram
tenants ||--o{ users : has
tenants ||--o{ api_clients : owns
tenants ||--o{ evaluations : owns
users ||--o{ evaluations : creates
users ||--o{ auth_audit_log : actor
api_clients ||--o{ auth_audit_log : actor
tenants {
UUID id PK
TEXT name
TEXT cage_code
TEXT sam_uid
}
users {
UUID id PK
UUID tenant_id FK
TEXT first_name
TEXT last_name
TEXT email
user_role role
}
api_clients {
UUID id PK
UUID tenant_id FK
TEXT client_id
TEXT client_secret
api_scope[] scopes
}
evaluations {
UUID id PK
UUID tenant_id FK
TEXT control_id
TEXT status
}
auth_audit_log {
UUID id PK
UUID actor_id
UUID tenant_id FK
TEXT action
TEXT result
}
👤 User Roles
flowchart LR
A[client_user] -->|RLS: Own tenant only| EvalTable
B[client_admin] -->|RLS: Own tenant only + mgmt| EvalTable
C[reviewer] -->|RLS: Read all tenants| EvalTable
D[superadmin] -->|RLS: Full control| EvalTable & UserTable
| Role | Description | Access Scope |
|---|---|---|
client_user |
End user | Own tenant only |
client_admin |
Tenant admin | Own tenant (plus user mgmt) |
reviewer |
Internal auditor or compliance | All tenants (read-only) |
superadmin |
Platform operator | Full access to all data |
🔐 RLS Policies
| Table | Role(s) | Access Type | Rule Description |
|---|---|---|---|
users |
All | Self only | id = auth.uid() |
evaluations |
client_* |
Tenant-bound | Match tenant via set_config() |
evaluations |
reviewer |
Global read | Unrestricted SELECT |
evaluations |
superadmin |
Full access | Unrestricted ALL w/ check |
api_clients |
All | Own tenant only | enabled=true AND tenant match |
auth_audit_log |
All | Tenant-bound | Match tenant |
🔑 Session Variables (No JWT Custom Claims)
Instead of deprecated JWT claim injection, ComplyCore uses:
SELECT set_config('request.jwt.claim.role', user.role, true);
SELECT set_config('request.jwt.claim.tenant_id', user.tenant_id::text, true);
This enables per-session RLS enforcement and simplifies system-wide access control.
🛡️ NPE: Non-Person Entities (API Clients)
Table: api_clients
| Field | Purpose |
|---|---|
client_id |
Public API token ID |
client_secret |
Auth key (hashed) |
tenant_id |
Enforces scope per client |
scopes[] |
Least-privilege operations |
enabled |
Soft-delete / disable mechanism |
Scopes Enum:
uploadevaluateread_reportsmanage_projects
RLS prevents disabled clients or cross-tenant access.
📝 Audit Logging
Table: auth_audit_log
| Field | Type | Description |
|---|---|---|
actor_id |
UUID | User or service account |
tenant_id |
UUID | Organization context |
action |
TEXT | Description (e.g., login_success) |
target_table |
TEXT | Optional: table affected |
result |
TEXT | success or fail |
timestamp |
TIMESTAMP | System-generated UTC timestamp |
This log supports:
- Login tracking
- API usage validation
- Internal audit trail for CMMC/DFARS controls
🧠 CMMC Practice Coverage
| Practice | Control Area | Implementation |
|---|---|---|
| AC.1.001 | Access Control | Unique accounts (auth.users + users) |
| AC.1.002 | Access Enforcement | RBAC and RLS |
| AC.1.003 | Least Privilege | Role + tenant-scoped access |
| AU.2.042 | Audit Logs | auth_audit_log |
| IA.2.078 | MFA Capable | mfa_enabled flag (enforced by UI) |
| SC.3.177 | NPE Separation | api_clients with isolated scopes |
📎 Appendices
🔧 Initial Setup Function
CREATE OR REPLACE FUNCTION set_claim_context()
RETURNS void
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
v_role TEXT;
v_tenant UUID;
BEGIN
SELECT role, tenant_id INTO v_role, v_tenant
FROM public.users
WHERE id = auth.uid();
PERFORM set_config('request.jwt.claim.role', v_role, true);
PERFORM set_config('request.jwt.claim.tenant_id', v_tenant::text, true);
END;
$$;
Call this at the start of every request/session to enforce scoped access.
✅ Status
| Component | Status | Notes |
|---|---|---|
| Supabase Auth | ✅ Integrated | Used for identity backing |
| Postgres Tables | ✅ Complete | tenants, users, api_clients, audits |
| RLS Policies | ✅ Enforced | All core tables |
| Session Claims | ✅ Supported | Via set_config() |
| MFA Support | 🟡 Flagged | Client-side UI pending |
Maintained by: Kell Engineering
Contact: mtkell@kellengineering.com
Document ID: AUTH-DOC-001