An access policy describes who may view protected content.
A policy row is exactly one of:
elementId set; applies to entries in that channel or structure when no element (or structure-parent) policy wins. Singles are not listed in General Access — set access on the single entry.sectionId set; applies to every entry in that channel with no element policy.groupId set; applies when no element (or structure-parent) policy wins.productTypeId set; applies when no element (or structure-parent) policy wins (requires Craft Commerce).Never combine multiple scope columns on the same row.
Principals are the audiences attached to a policy:
Built-in resolver types also include guest and public for the authorization engine. The current Control Panel editor focuses on groups and users; choosing Everyone removes the policy instead of storing a public principal.
| Mode | Storage | Front-end result |
|---|---|---|
| Everyone | No policy for that element/scope | Visible to all visitors |
| Members only | Policy with selected groups/users | Only matching logged-in members |
| Members only with no audiences | Policy with zero principals | Fail-closed — hidden from everyone |
For each element (after optional bypasses below):
Step 2 applies to structure entries, categories, and Commerce products whose type uses a structure. Channel/single entries and flat product types skip it (no parents).
These run before policy resolution when enabled in settings/config:
| Setting | Effect |
|---|---|
| Admins always have access (adminAlwaysAccess) | Craft admin users see all protected content on the front end |
| Authors always have access (authorAlwaysAccess) | Entry authors always see their own entries (entries only; not categories or products) |
Control Panel requests always bypass filtering regardless of these settings.
The same order is used by:
AuthorizationServiceIf a policy exists but no principal matches the current visitor, access is denied. Empty audience lists are valid and mean “protected, nobody allowed yet.”