Minor Changes
-
71e8c55: A
security.grantjudge that loads its answers can hold the first navigation:ready()(#2412).Reloading an entity page with a backend-judged app landed on the home page with "Access Denied": the first navigation starts inside
createApp(), before the judge's request can answer, and its cache miss fell through to an empty role matrix. The documented workaround — fetching beforecreateApp()— could not work either: the judge'sinstall()runs insidecreateApp().grant: { isGranted: (attribute) => answers.get(attribute), ready: () => loading, // the load in progress }
The route guard now waits for
ready()on entity routes before deciding. It still fails closed: a rejection, or no settling withinsecurity.readyTimeoutMs(10 s by default), denies the navigation with a console error naming the judge. Judges withoutready()behave exactly as before, synchronously.The security docs replace the pre-warm example with one that works: load on
kernel:readyandauth:login, and return that load fromready().
Patch Changes
-
afaa862:
ROLE_ANONYMOUSstays undeletable whenRolesManageris given anotheridField(#2406).The protection read the role code from
nameonly, so an app keeping roles behind its own API withnew RolesManager({ storage, idField: 'id' })silently lost it: the UI offered to deleteROLE_ANONYMOUSlike any other role. It now readsnameand theidFieldvalue.The security docs now describe
RolesManageras what it is — therolessystem entity — including how to keep it on your own storage, and whysystemis set by the framework's managers, not by apps.