If you have ever been asked "who can see this space?" during a SOC 2 or ISO 27001 review, you will have discovered that Confluence Cloud has no straightforward answer. There is no built-in report showing user access across all pages at space or global level. On Server and Data Center you could run a SQL query against the database. On Cloud that door is closed, and Premium only adds a single-user permission inspector, which answers "what can Anna see?" one person at a time, not "who can see this page?" across a space.
This post covers what you can actually do natively, where those methods stop working, and the one inheritance behaviour that quietly breaks most access reviews.
This is the part worth knowing even if you read nothing else.
In Confluence, view restrictions cascade down the page tree. Restrict viewing on a parent page and every child below it inherits that restriction, whether or not you touch the children.
Edit restrictions do not cascade. They apply only to the page you set them on.
The consequence: you can have a page that is correctly hidden from most of the company, while everyone who can still see it is also able to edit it. In the UI it looks locked down. There is a padlock. An auditor glancing at it would tick the box. But the page is editable by every person in the inheriting audience.
Concretely:
Handbook (view restricted to: HR group)
└── Compensation Bands <- inherits the view restriction, no edit restriction set
└── 2026 Salary Review <- same
Everyone in HR can see those pages, which is intended. Everyone in HR can also silently rewrite the salary bands, which usually is not. Nobody set that up deliberately, it is just what inheritance does by default.
This is also the mechanism behind CONFCLOUD-5095, the long-running request for edit-permission inheritance, which has accumulated a large vote count over many years.
1. Per-page check. Open a page, three dots menu, Restrict Permissions. This shows the view and edit lists for that page, and tells you if restrictions are inherited from an ancestor. Accurate, and fine for a handful of pages.
2. Find the ancestor a restriction comes from. Confluence tells you a page is inheriting, but not from where. Walk up the tree: start at the space home, open Restrictions on each ancestor going down. The first ancestor with a view restriction is the one propagating.
3. Search for what you can reach. In a space, search spacekey: ~me to list pages you have browse or edit access to. Useful, but note the limits: it reflects your access, so it cannot tell you what a colleague sees, and it does not separate view from edit.
4. Premium user inspector. If you are on Premium, you can inspect an individual user's permissions. Good for "does Anna have access she should not?", not for "who has access to this?"
5. Audit log. Confluence Cloud audit logging now covers permission changes, including page-level privacy changes. This tells you what changed, which is valuable for investigations, but it does not give you the current state. An audit log answers "who changed this and when", not "what is the situation right now".
All of the above are per-page or per-user. None of them produce the thing an access review actually needs, which is a table: page, path, who can view, who can edit.
Once a space is more than a few dozen pages, checking each one by hand stops being realistic, and the manual pass is exactly where mistakes survive. The inheritance trap above is invisible unless you compare the view list and the edit list side by side for every page.
Regardless of tooling, these are the things worth checking:
If your restrictions were set per user, the fix is worth doing before your next review:
Doing it in that order means nobody loses access mid-migration.
Everything above is native Confluence. No add-ons required, and the manual methods are real methods, they just stop scaling somewhere around a few dozen pages.
Full disclosure on where I am coming from: I am the founder of Stackedboost, an Atlassian Marketplace Partner, so Confluence permissions are something I spend an unreasonable amount of time inside.
If you have found a cleaner way to handle the view-versus-edit inheritance problem at scale, I would genuinely like to hear it. It is the part that still has no good native answer, and I have not seen anyone solve it with built-in features alone.
Peter Hallander _Stackedboost_
6 comments