03 / Enterprise panels
Access Control
A control plane for fine grained permissions
- Client
- Enterprise platform teams
- Role
- Senior engineer, design and build
Product work for banks and enterprises. Client and product names are not disclosed.
The challenge
Access rules lived as static lists in the panel while the gateway made the real decisions. Modelling who can do what across people, teams, places and documents was guesswork, and a mistaken rule could only be found after it reached production.
How it fits together
The approach
- 01
A control plane, not another engine
The designer models and publishes; the authorization engine decides. It never replaces the identity provider or the gateway, which keeps every system responsible for one thing.
- 02
A lifecycle with immutable versions
Draft, validate, review, publish, deploy. A published version is frozen with its schema, canonical form and hash; fixing it means branching a new draft, and every step is audited with a diff and impact analysis before release.
- 03
Tests that explain themselves
Pick a subject, a resource and a permission and get the decision with a proof trace. A deny says whether a relation is missing or a condition failed, and test fixtures can never reach production.
- 04
Tenant isolation in depth
The tenant comes from the verified session, never the request. Every table carries it, keys are scoped by it, and PostgreSQL row level security backs up the application checks.
- 05
An editor built for the model
Explorer, graph canvas and inspector side by side, an expression builder that shows errors where they are, and five distinct error classes so people know what to fix.
Results
~80
operations in the OpenAPI contract
17
normalised entities behind the lifecycle
0
test fixtures allowed into production
Stack
SpiceDB, PostgreSQL, CEL, OpenAPI, Next.js, TypeScript
Next project ↗
Branch Liquidity
Liquidity supervision for bank branch networks