What each layer actually buys you
- Menu visibility: a clean interface and fewer accidental clicks into places a person has no business being.
- Route guards: a graceful refusal instead of a broken screen when someone follows a stale link.
- API and database checks: the only layer that decides whether the data moves.
Hidden versus disabled
A disabled control still advertises that a capability exists and invites a request for it. Hiding it entirely is usually the better product decision, because the interface stops describing a system the user is not part of. Neither choice, however, changes the answer the server gives.
Deriving all three from one source
The failure mode is drift: the menu is updated when a permission changes and the API is not, or the reverse. The fix is a single declared contract that both the interface and the enforcement layers read, so a permission change is one edit rather than three that must be remembered.