Я работал над системой 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)
Задача ещё не решена.
Других решений пока нет …