Рекомендация для ACL Design: компания с несколькими местоположениями и несколькими ресурсами

Я работал над системой ACL для следующего, и я просто не могу найти элегантное решение.

Компания может иметь несколько местоположений, а в нескольких местах могут быть активированы или не активированы определенные модули / функции (ресурсы).

Пользователи могут быть назначены только одной компании, но могут быть назначены нескольким местоположениям. Каждый уровень цепочки должен иметь разрешения на действия. Например, Company-> addLocation (), Location-> addUser (), Resource-> doAction ().

Ресурс / модуль будет иметь объекты, связанные с ним, поэтому, если новый объект ресурса создается в местоположении 1, этот объект ресурса связан с расположением 1, и только пользователи с соответствующими разрешениями в этом местоположении или на этом ресурсе должны иметь возможность действовать.

Проблема, с которой я сталкиваюсь, заключается в том, как избежать создания новых групп / разрешений для каждой создаваемой компании / местоположения. Я хочу, чтобы система была достаточно гибкой, чтобы аутентифицировать запрос примерно так:

function Resource_1_Submit()
{
ACL->isAllowed($User);
// Continue
}

Я просто бегаю кругами, потому что кажется, что контрольные точки аутентификации настолько динамичны, что сложно построить действительно элегантную и простую систему. Это похоже на то, что базовой системы групп / ролей / разрешений недостаточно для выполнения ACL в сложной схеме, подобной этой.

Вот структура:

Компания (CID-1)
| |
| | --- Разрешение компании 1 (P_CID-1)
| | --- Разрешение компании 2 (P_CID-2)
| | --- Разрешение компании 3 (P_CID-3)
|
| ---- Местоположение 1 (LID-1)
| |
| | --- Разрешение на местоположение 1 (P_LID-1)
| | --- Разрешение на размещение 2 (P_LID-2)
| | --- Разрешение на размещение 3 (P_LID-3)
| |
| | ---- Ресурс 1 (МПОГ-1)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 2 (МПОГ-2)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 3 (МПОГ-3)
| | --- Разрешение на ресурс 1 (P_RID-1)
| | --- Ресурс Разрешение 2 (P_RID-2)
| | --- Ресурс Разрешение 1 (P_RID-3)
|
| ---- Местоположение 2 (LID-2)
| |
| | --- Разрешение на местоположение 1 (P_LID-1)
| | --- Разрешение на размещение 2 (P_LID-2)
| | --- Разрешение на размещение 3 (P_LID-3)
| |
| | ---- Ресурс 1 (МПОГ-1)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 3 (МПОГ-3)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 4 (МПОГ-4)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 5 (МПОГ-5)
| | --- Разрешение на ресурс 1 (P_RID-1)
| | --- Ресурс Разрешение 2 (P_RID-2)
|
| ---- Местоположение 3 (LID-3)
| |
| | --- Разрешение на местоположение 1 (P_LID-1)
| | --- Разрешение на размещение 2 (P_LID-2)
| | --- Разрешение на размещение 3 (P_LID-3)
| |
| | ---- Ресурс 1 (МПОГ-1)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 3 (МПОГ-3)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 4 (МПОГ-4)
| | | --- Разрешение на ресурс 1 (P_RID-1)
| | | --- Ресурс Разрешение 2 (P_RID-2)
| | | --- Ресурс Разрешение 1 (P_RID-3)
| | ---- Ресурс 5 (МПОГ-5)
| --- Разрешение на ресурс 1 (P_RID-1)
| --- Ресурс Разрешение 2 (P_RID-2)

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …