Из того, что я понимаю по вашему вопросу, может быть два пути решения ваших проблем.
Первый - это использование иерархических ролей (наследование ролей). Хотя это сложнее в реализации и управлении, это может обеспечить очень интересный уровень гибкости.
Второй способ (если он может представлять интерес) - это то, с чем я экспериментировал, пытаясь «расширить» RBAC по академическим причинам.
Что я сделал, так это разрешил определение двух или более «именованных» уровней для каждой роли. Поэтому, учитывая роль программиста, моя реализация позволяет добавлять уровни к роли, такие как:
Программист, определение уровня:
- "Старший" = уровень 500
- "Средний" = уровень 200
- "Младший" = уровень 0
Поэтому, когда кто-то назначает разрешения для экземпляра объекта, такого как документ спецификации, он может быть назначен следующим образом:
«Некоторый документ» -> Программист (уровень 300) -> может редактировать
«Какой-то документ» -> Программист (уровень 0) -> умеет читать
«Какой-то документ» -> Программист (уровень 500) -> может удалить
Это означает, что все программисты могут читать документ, но юниорам и промежуточным лицам не разрешено редактировать такой документ из-за отсутствия полномочий уровня. И только старший программист может удалить документ.
Это позволяет мне иметь 3 разных уровня разрешений, только создав одну роль. В традиционной системе мне пришлось бы создать три разные роли (4 с наследованием), такие как:
В неиерархической реализации:
- Старший программист
- Средний программист
- младший программист
В иерархической реализации:
- Программист
- Старший программист (расширяет Программист)
- Средний программист (расширяет Программист)
- младший программист (расширяет программист)
Очевидно, что уровни должны быть правильно определены как под-роли. Определение уровня «Аналитик» будет недопустимым, поскольку это две разные роли, а не подтип.