@quatrain/auth-rbac
📦 API Reference: Detailed TypeScript documentation, classes, interfaces, and methods are available in the TypeDoc API Reference for @quatrain/auth-rbac ↗.
License: AGPL-3.0-only
Isomorphic Role-Based Access Control, Field-Level Security, M2M Agent Guards & Tarpitting for Quatrain
@quatrain/auth-rbac is an isomorphic, cloud-native authorization engine designed for the Quatrain ecosystem. It provides unified, declarative access control spanning:
- Macro-Security: Route and endpoint protection (URI patterns + HTTP methods).
- Micro-Security (FLS): Field-Level Security calculating
hidden,readonly, andreadwritemodes per entity property. - Automated Payload Sanitization:
sanitizeRead()andsanitizeWrite()eliminating schema duplication. - M2M & AI Agent Defense: Subject-type separation (
human,agent,service) with built-in tarpitting (progressive latency injection and request throttling for automated scraping and runaway agent loops). - Isomorphic Middlewares: Abstract base class with concrete adapters for Express and Astro SSR/API.
Installation
Within the Quatrain monorepo:
{
"dependencies": {
"@quatrain/auth-rbac": "workspace:*"
}
}Core Architecture
@quatrain/auth-rbac
├── engine/
│ ├── RbacPolicyEngine # Resolves role inheritance, route matching, FLS and payload sanitization
│ └── TarpitManager # Manages sliding-window request throttling and progressive latency injection
├── middlewares/
│ ├── AbstractRbacMiddleware # Agnostic middleware foundation
│ ├── ExpressRbacMiddleware # Standard Express (req, res, next) guard
│ └── AstroRbacMiddleware # Unified Astro SSR and API guard
└── types/ # Strongly typed interfaces and contractsQuick Example
import { RbacPolicyEngine } from '@quatrain/auth-rbac'
const engine = new RbacPolicyEngine([
{
id: 'curator',
name: 'Agronomy Curator',
routes: [
{ pattern: '/api/curate', methods: ['GET', 'POST'], access: 'allow' },
{ pattern: '/**', methods: ['*'], access: 'deny' }
],
entities: {
'okf-document': {
defaultMode: 'readwrite',
fields: {
soa: 'readonly',
internalReviewerNotes: 'hidden'
}
}
}
}
])
const user = { id: 'u1', roles: ['curator'], subjectType: 'human' }
// 1. Route check
engine.canAccessRoute(user, '/api/curate', 'POST') // true
// 2. Field mode check
engine.getFieldAccess(user, 'okf-document', 'soa') // 'readonly'
engine.getFieldAccess(user, 'okf-document', 'internalReviewerNotes') // 'hidden'
// 3. Payload sanitization
const cleanPayload = engine.sanitizeWrite(user, 'okf-document', {
title: 'Soil Guide',
soa: 'malicious/soa', // Stripped automatically
internalReviewerNotes: 'Secret' // Stripped automatically
})