Admin Dashboard¶
ShieldAdmin is the unified admin interface. It mounts the HTMX dashboard UI and the REST API (used by the CLI) under a single path.
Mounting ShieldAdmin¶
from fastapi import FastAPI
from shield.core.engine import ShieldEngine
from shield.fastapi.middleware import ShieldMiddleware
from shield.admin import ShieldAdmin
engine = ShieldEngine()
app = FastAPI()
app.add_middleware(ShieldMiddleware, engine=engine)
# Mount at /shield — exposes dashboard UI + REST API
app.mount(
"/shield",
ShieldAdmin(
engine=engine,
auth=("admin", "secret"),
prefix="/shield",
),
)
After starting the server:
- Dashboard UI:
http://localhost:8000/shield/ - Audit log:
http://localhost:8000/shield/audit - Rate limits:
http://localhost:8000/shield/rate-limits - Blocked requests:
http://localhost:8000/shield/blocked - REST API:
http://localhost:8000/shield/api/
Authentication¶
auth= accepts three forms:
Token invalidation
When you change auth= (new user, changed password), all previously issued tokens are automatically invalidated on restart, even if secret_key is stable. This is handled by mixing an auth fingerprint into the HMAC signing key.
Dashboard UI¶
The dashboard renders all registered routes with live status badges:
| Status | Colour | Description |
|---|---|---|
ACTIVE |
Green | Route responding normally |
MAINTENANCE |
Yellow | Route returning 503 |
DISABLED |
Red | Route permanently off |
ENV_GATED |
Blue | Route restricted to specific environments |
DEPRECATED |
Grey | Route still works but headers warn clients |
Actions per route¶
- Enable: restore route to
ACTIVE - Maintenance: put in maintenance with optional reason + window
- Disable: permanently disable with reason
- Env Gate: open a modal to set the allowed environments (comma-separated). The current
allowed_envslist is pre-filled. Submitting updates the route toENV_GATEDimmediately; leaving the field empty and submitting is the same as callingenableto clear the gate.
Live updates (SSE)¶
The dashboard connects to the /shield/events SSE endpoint. When state changes (from another browser tab, CLI command, or API call), the affected row updates in real time without a page reload.
Rate limits¶
http://localhost:8000/shield/rate-limits shows all registered rate limit policies. Each row has three actions:
- Reset — clear counters immediately so clients get their full quota back
- Edit — update the limit, algorithm, or key strategy without redeploying
- Delete — remove a persisted policy override
Requires api-shield[rate-limit] installed on the server.
Blocked requests¶
http://localhost:8000/shield/blocked shows a paginated log of every request that was rejected with a 429. The log is capped at 10,000 entries (configurable via max_rl_hit_entries on the engine).
Audit log¶
http://localhost:8000/shield/audit shows a paginated table of all state changes:
- Timestamp
- Route
- Action (enable / disable / maintenance / etc.)
- Actor (authenticated username or "anonymous")
- Platform (
cliordashboard) - Status change — route status transitions shown as
old → new; rate limit actions shown as coloured badges (set,update,reset,delete) - Reason
REST API¶
The same mount exposes a JSON API used by the shield CLI:
| Method | Path | Description |
|---|---|---|
POST |
/api/auth/login |
Exchange credentials for a bearer token |
POST |
/api/auth/logout |
Revoke the current token |
GET |
/api/auth/me |
Current actor info |
GET |
/api/routes |
List all route states |
GET |
/api/routes/{key} |
Get one route |
POST |
/api/routes/{key}/enable |
Enable a route |
POST |
/api/routes/{key}/disable |
Disable a route |
POST |
/api/routes/{key}/maintenance |
Put route in maintenance |
POST |
/api/routes/{key}/env |
Set env gate ({"envs": ["dev", "staging"]}) |
POST |
/api/routes/{key}/schedule |
Schedule a maintenance window |
DELETE |
/api/routes/{key}/schedule |
Cancel a scheduled window |
GET |
/api/audit |
Audit log (?route= and ?limit= params) |
GET |
/api/global |
Global maintenance config |
POST |
/api/global/enable |
Enable global maintenance |
POST |
/api/global/disable |
Disable global maintenance |
GET |
/api/rate-limits |
List all rate limit policies |
GET |
/api/rate-limits/hits |
Blocked requests log |
DELETE |
/api/rate-limits/{key}/reset |
Clear counters for a route |
Advanced options¶
ShieldAdmin(
engine=engine,
auth=("admin", "secret"),
prefix="/shield", # must match the mount path
secret_key="stable-key", # omit in dev; set for production to survive restarts
token_expiry=86400, # token lifetime in seconds (default: 24 h)
)
| Option | Default | Description |
|---|---|---|
engine |
required | The ShieldEngine instance |
auth |
None (open) |
Credentials (see forms above) |
prefix |
"/shield" |
Mount path prefix (must match app.mount()) |
secret_key |
random | HMAC signing key; set a stable value in production |
token_expiry |
86400 |
Token lifetime in seconds |