мне нужно несколько советов о том, как обращаться контроль доступа к следующему сценарию:Symfony - эффективный контроль доступа (динамические) иерархические роли
- Корпорация
- Имеет один или много компаний
- имеет один или многие ROLE_CORP_ADMIN
- Компания
- Имеет на е или во многих регионах.
- Имеет один или несколько ROLE_COMPANY_ADMIN.
- Регион:
- имеет ноль или много магазинов.
- Имеет один или несколько ROLE_REGION_ADMIN.
- Магазин:
- имеет ноль или много активов.
- Имеет один или несколько ROLE_STORE_ADMIN.
- Имеет ноль или много ROLE_STORE_EMPLOYEE.
- Имеет нулевой или много ROLE_STORE_CUSTOMER (многие лучше).
Приложение должно поддерживать многие корпорации.
Моим инстинктом является создание отношений между многими для многих для их администраторов (например, region_id
, user_id
). В зависимости от производительности я мог бы пойти с более денормализованным столом с user_id
, corporation_id
, company_id
, region_id
и store_id
. Тогда я бы создать класс избирателей (единогласная стратегию):
public function vote(TokenInterface $token, $object, array $attributes)
{
// If SUPER_ADMIN, return ACCESS_GRANTED
// If User in $object->getAdmins(), return ACCESS_GRANTED
// Else, return ACCESS_DENIED
}
Поскольку разрешения являются иерархическими, функция getAdmins()
будет проверять все владелец для администраторов, а также. Например: $region->getAdmins()
также вернет администраторов для владеющей компании и корпорации.
Я чувствую, что мне не хватает чего-то очевидного. В зависимости от того, как я реализую функцию getAdmins()
, для этого подхода потребуется по крайней мере один удар по db на каждый голос. Есть ли «лучший» способ сделать это?
Заранее за вашу помощь.
спасибо за this.one вопрос: вы использовали 'ArrayCollection :: contains' для' порядка method.in isOwner' для 'ArrayCollection :: содержит 'для возврата true, он должен содержать ** тот же экземпляр ** объекта, который он ищет. Как это возможно, если вы получаете объект Person из объекта User и сравниваете его с' Человек в другом объекте, например: 'Store', чьи поколения не связаны. – user2268997