Sign-in by customer: realm petrolyst, row rules, guest role (PD-21)
Keycloak import for realm petrolyst: two clients, petrolyst with MFA for Superset and Traefik, petrolyst-app password only. It lists only app.petrolyst.com and traefik.petrolyst.com, and no customer names, as this repository is public. public.v_operator shows each customer's group. Dashboards overview and site, role Petrolyst Guest, filtered by row. Superset refuses a user with no mapped role. The realm travels with the release: each release's compose files name their realm and secret file, and a rollback needs only its target's secret. Not deployed. Checks earlier on this content: tests/run.sh 109 of 109 and read-only, dashboards import twice, column drift 0, compose config on old and new trees, the secret check on a scratch folder, a rehearsal on a throwaway Keycloak 26.4. Never a real deploy or rollback; shellcheck not installed today, clean when last run. Codex inspected once; its fixes are not re-inspected, on the owner's word. Bands: persistence, Superset. Rules: 1, 2, 3, 6, 14. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ab553526f6
commit
78a498f1ce
20 files changed
+279
-78
No files matched your search
@@ -18,7 +18,9 @@ CREATE TABLE fm.operator (
|
||||
name text NOT NULL,
|
||||
label_issuer text NOT NULL, -- whose labels this customer's people see (holder_alias.issuer)
|
||||
programme text NOT NULL, -- the programme v_site reports (participation.programme)
|
||||
timezone text NOT NULL -- for a holder with no place, or a place without its own
|
||||
timezone text NOT NULL, -- for a holder with no place, or a place without its own
|
||||
keycloak_group text NOT NULL UNIQUE -- the top-level Keycloak group of this customer's people (PD-21)
|
||||
CHECK (keycloak_group ~ '^/[^/]+$')
|
||||
);
|
||||
|
||||
-- Provenance ------------------------------------------------------------------------------
|
||||
|
||||
@@ -631,4 +631,9 @@ SELECT s.site_uid, s.site_code, s.site_name, s.site_label, s.operator_uid,
|
||||
FROM fm.imported_calculation c JOIN public.v_site s ON s.site_uid = c.holder_uid
|
||||
WHERE c.claim_status IN ('asserted','reviewed','disputed');
|
||||
|
||||
-- Which Keycloak group is which customer (PD-21). Only server/ reads this, at sign-in; it holds no
|
||||
-- site data, and no dashboard has a dataset on it.
|
||||
CREATE VIEW public.v_operator AS
|
||||
SELECT operator_uid, name, keycloak_group FROM fm.operator;
|
||||
|
||||
COMMIT;
|
||||
@@ -14,7 +14,7 @@ The design and its rationale live in the fuel-monitoring corpus:
|
||||
|---|---|---|
|
||||
| `0001_fm_core.sql` | schema `fm`, `btree_gist` in it, 29 tables (customers, assets, places and holders, claims, reviews, baselines), constraints, trigger-backed rules 1–15 | no |
|
||||
| `0002_fm_derivations.sql` | internal views in `fm`: claims → visits → stock intervals → L/h and L/day intervals, dependency hashes, baseline validity | no |
|
||||
| `0003_bi_views.sql` | `fm.v_site_baseline_status` and the 18 `public.v_*` views Superset reads | yes, read-only |
|
||||
| `0003_bi_views.sql` | `fm.v_site_baseline_status` and the 19 `public.v_*` views Superset reads | yes, read-only |
|
||||
| `0004_licence.sql` | schema `licence`: plans, prices, entitlements, customer licences, overrides and their change log (PD-19, PD-20). Holds no customer's licence | no |
|
||||
|
||||
Each file is one transaction. Apply them in order.
|
||||
@@ -51,7 +51,7 @@ point 8, closed 30 Oct 2026).
|
||||
|
||||
3. Check as `fuel_ro`
|
||||
(`docker exec -it petrolyst-fuel-db-1 psql -U postgres -d fuel`, then `SET ROLE fuel_ro;`):
|
||||
- `\dv public.*` lists the 18 `v_*` views;
|
||||
- `\dv public.*` lists the 19 `v_*` views;
|
||||
- `SELECT count(*) FROM fm.holder;` fails with "permission denied for schema fm";
|
||||
- `SELECT count(*) FROM licence.plan;` fails with "permission denied for schema licence".
|
||||
|
||||
|
||||
Reference in new issue
Block a user