mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-02-12 11:19:36 +03:00
Role with restricted permissions overrides broader role access at content level #5324
Closed
opened 2026-02-05 09:57:47 +03:00 by OVERLORD
·
6 comments
No Branch/Tag Specified
development
l10n_development
release
llm_only
vectors
v25-11
docker_env
drawio_rendering
user_permissions
ldap_host_failover
svg_image
prosemirror
captcha_example
fix/video-export
v25.12.3
v25.12.2
v25.12.1
v25.12
v25.11.6
v25.11.5
v25.11.4
v24.11.4
v25.11.3
v25.11.2
v25.11.1
v25.11
v25.07.3
v25.07.2
v25.07.1
v25.07
v25.05.2
v25.05.1
v25.05
v25.02.5
v25.02.4
v25.02.3
v25.02.2
v25.02.1
v25.02
v24.12.1
v24.12
v24.10.3
v24.10.2
v24.10.1
v24.10
v24.05.4
v24.05.3
v24.05.2
v24.05.1
v24.05
v24.02.3
v24.02.2
v24.02.1
v24.02
v23.12.3
v23.12.2
v23.12.1
v23.12
v23.10.4
v23.10.3
v23.10.2
v23.10.1
v23.10
v23.08.3
v23.08.2
v23.08.1
v23.08
v23.06.2
v23.06.1
v23.06
v23.05.2
v23.05.1
v23.05
v23.02.3
v23.02.2
v23.02.1
v23.02
v23.01.1
v23.01
v22.11.1
v22.11
v22.10.2
v22.10.1
v22.10
v22.09.1
v22.09
v22.07.3
v22.07.2
v22.07.1
v22.07
v22.06.2
v22.06.1
v22.06
v22.04.2
v22.04.1
v22.04
v22.03.1
v22.03
v22.02.3
v22.02.2
v22.02.1
v22.02
v21.12.5
v21.12.4
v21.12.3
v21.12.2
v21.12.1
v21.12
v21.11.3
v21.11.2
v21.11.1
v21.11
v21.10.3
v21.10.2
v21.10.1
v21.10
v21.08.6
v21.08.5
v21.08.4
v21.08.3
v21.08.2
v21.08.1
v21.08
v21.05.4
v21.05.3
v21.05.2
v21.05.1
v21.05
v21.04.6
v21.04.5
v21.04.4
v21.04.3
v21.04.2
v21.04.1
v21.04
v0.31.8
v0.31.7
v0.31.6
v0.31.5
v0.31.4
v0.31.3
v0.31.2
v0.31.1
v0.31.0
v0.30.7
v0.30.6
v0.30.5
v0.30.4
v0.30.3
v0.30.2
v0.30.1
v0.30.0
v0.29.3
v0.29.2
v0.29.1
v0.29.0
v0.28.3
v0.28.2
v0.28.1
v0.28.0
v0.27.5
v0.27.4
v0.27.3
v0.27.2
v0.27.1
v0.27
v0.26.4
v0.26.3
v0.26.2
v0.26.1
v0.26.0
v0.25.5
v0.25.4
v0.25.3
v0.25.2
v0.25.1
v0.25.0
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.2
v0.23.1
v0.23.0
v0.22.0
v0.21.0
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.0
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.15.3
v0.15.2
v0.15.1
v0.15.0
v0.14.3
v0.14.2
v0.14.1
v0.14.0
v0.13.1
v0.13.0
v0.12.2
v0.12.1
v0.12.0
v0.11.2
v0.11.1
v0.11.0
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.6
v0.7.5
v0.7.4
v0.7.3
0.7.2
v.0.7.1
v0.7.0
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.0
Labels
Clear labels
🎨 Design
📖 Docs Update
🐛 Bug
🐛 Bug
:cat2:🐈 Possible duplicate
💿 Database
☕ Open to discussion
💻 Front-End
🐕 Support
🚪 Authentication
🌍 Translations
🔌 API Task
🏭 Back-End
⛲ Upstream
🔨 Feature Request
🛠️ Enhancement
🛠️ Enhancement
🛠️ Enhancement
❤️ Happy feedback
🔒 Security
🔍 Pending Validation
💆 UX
📝 WYSIWYG Editor
🌔 Out of scope
🔩 API Request
:octocat: Admin/Meta
🖌️ View Customization
❓ Question
🚀 Priority
🛡️ Blocked
🚚 Export System
♿ A11y
🔧 Maintenance
> Markdown Editor
pull-request
Mirrored from GitHub Pull Request
No Label
🐕 Support
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/BookStack#5324
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @rozdun on GitHub (Jun 23, 2025).
Describe the Bug
If a user has two roles - e.g. Team X (no permissions) and Leader (full access - view, create, etc), and content (e.g. a book) overrides Team X by giving it View permission and nothing else, the user is blocked from editing, even though their Leader role has global update/delete rights.
Steps to Reproduce
Expected Behaviour
Screenshots or Additional Context
I want to be able to create a role for every team, which I explicitly grant View access to a specific shelf or book, and I want to have a single Leader role that has global Update and Delete permissions, which combined with the first role will let them both view content and edit that specific shelf/book. Currently this is not possible without explicitly adding both roles to every shelf/book.
Browser Details
Irrelevant
Exact BookStack Version
v24.12.1
@ssddanbrown commented on GitHub (Jun 23, 2025):
Hi @rozdun,
That's the expected behaviour, since by setting those specific permissions for the "Team X" roles without
editenabled, that's specifically deny that ability to that role, which will override any role level permissions.If it is to every book, then you might be better off to avoid adding leaders to the team roles since it sounds like they have different permission requirements in your scenario, but that's all specific to the scenario/context.
Otherwise, yeah, you'll need to also specifically grant the permissions back to the leaders role.
@rozdun commented on GitHub (Jun 23, 2025):
Hi @ssddanbrown, thanks for a quick response.
Well to be slightly pedantic here, I add a view permission and the system does not give me the ability to pull the other permissions from the role level, leaving me with having to disable them. I have very limited options as a user there.
But how can I have, say, 20 different books, each with users who can either only view or view and edit, without creating 40 roles (20 for Team X, 20 for Team X Leader) and adding both roles for each shelf explicitly? To me, 20 "view access" roles + 1 "global edit" role feels like a natural option here, and the interface suggests it should work this way:
To me, this says "set permissions based on roles added explicitly above, THEN add permissions based on any other roles you might have".
Whereas the current design is "set permissions based on roles added explicitly above, then ignore any permissions you may have from other roles", which is incredibly unintuitive.
A global role granting full access should not be negated by a restricted role unless the restriction is explicitly set for that role on the same content.
@rozdun commented on GitHub (Jun 23, 2025):
Correction on one point:
What’s actually possible is assigning 20 "view access" roles plus 1 "global edit" role, but both roles must be explicitly added to each book’s permissions.
For example:
– Team X → View only
– Leader → Edit and delete (relies on Team X for view)
The edit role doesn't inherit unless it's also added, which defeats the purpose of a global role.
@ssddanbrown commented on GitHub (Jun 23, 2025):
They are not ignored (unless inheritance is disabled via everyone else), it's just that the lack of edit permission set for their role is more specific/focused so overrides their globally set permissions.
This all comes down to expectations, which depend on your desired approach to permissions & context.
If we changed to your desired logic, then I'll have other folks complaining that they're not able to specifically deny permissions for a role due to them inheriting grants from other role-level defaults.
We could add tri-state permissions (Enable/Deny/Default, where default would allow inheritance from wider permission levels) but I'm hesitant to add much extra complexity to an already complex system.
@rozdun commented on GitHub (Jun 23, 2025):
From a user perspective, they are ignored. A single scoped role with limited permissions cancels all broader grants, rendering global roles ineffective unless redundantly re-applied at every content node. This breaks the premise of inheritance and defeats the purpose of centralized role design.
I'd hazard a guess that most real-world scenarios prioritize granting access to regular users over restricting access to superusers, hence why what I described feels to me like the proper default, and it aligns with standard additive RBAC expectations.
Nevertheless, Enable/Deny/Default would indeed solve both cases and it is very much worth adding.
BookStack already has more granular options than many other solutions, and either people need it (like my group) or they don't, in which case BookStack would already be too complex for them anyway. A power user (which an administrator should be) will instantly understand how this works because it's not a new concept (e.g. Discord).
@ssddanbrown commented on GitHub (Jun 23, 2025):
Okay. I'll go ahead and close this off since I wouldn't look to change the default functionality/logic as originally requested but feel free to open a feature request for the tri-state content-level permission control, so it can gather support for potential future consideration.