alepha@docs:~/docs/reference/providers$
cat PermissionRegistryProvider.md | pretty
2 min read
Last commit:

#PermissionRegistryProvider

#Import

typescript
1import { PermissionRegistryProvider } from "alepha/security";

#Overview

Answers "does the caller hold this permission?" from the set the server sent down with the API registry.

The server resolves a user's roles into concrete permission names before sending them (SecurityProvider.getPermissions, where a * role expands to the full list), so this side never has to resolve a role — it matches names against an already-flat list. A wildcard is therefore only meaningful on the requirement (orders:* = "anything in this group"), never on a grant.

#Why this reads the store instead of injecting LinkProvider

LinkProvider.can() answers the same question and is the canonical implementation — but it lives in alepha/server/links, which already imports types from alepha/security. A value import back would close the loop security -> server/links -> security, which the build's module analyzer rejects (it counts type-only imports as edges).

So this reads the same store key LinkProvider reads, and duplicates only the matching rule — six lines, pinned against LinkProvider by server/links/__tests__/permission-matching-parity.spec.ts so the two cannot drift apart silently.

Nothing here enforces anything: the browser is not an enforcement point, and the server re-checks every permission on the real request. This exists so the UI agrees with the answer the server would give.