На счёт ACL. В большинстве случаев штука достаточно специфичная, но можно попробовать реализовать некоторые базовые интерфейсы и некоторый простой вариант для тех кто не хочет заморачиваться над изобретением велосипеда в простой ситуации.
Идеи:
1) Yiisoft\Access\AccessCheckerInterface переименовать в Yiisoft\Access\
UserAccessCheckerInterface.
2) Добавить Yiisoft\Access\ACLAccessCheckerInterface и простую его реализацию (по аналогии с RBAC для AccessCheckerInterface)
Код: Выделить всё
interface ACLAccessCheckerInterface
{
public function aclHasPermission($userId, string $permissionName, $entity, array $parameters = []): bool;
}
Пакет ACL как и RBAC будет иметь разные варианты хранения ACL (отдельная таблица в базе данных, отдельное поле в Entity).
Можно добавить базовый интерфейс ACLEntityInterface для возможности кастомизации проверки ACL для Entity (экземпляры Entity будут реализовывать данный интерфейс, сами реализуя механизм проверки).
К примеру можно добавить документу проверку статуса документа или дефолтные права для какой либо группы пользователей (что бы не размещать их в каждом отдельном документе).
Код: Выделить всё
interface ACLEntityInterface
{
public function aclHasPermission($userId, string $permissionName, \Yiisoft\Access\AccessCheckerInterface $accessChecker, array $parameters = []): bool;
}
Все Entity для которых будет осуществляться проверка простым ACL, должны поддерживать интерфейс UniqueEntityInterface или любой другой интерфейс, позволяющий уникально идентифицировать Entity. Возможно данный интерфейс можно реализовывать в какой нибудь ActiveRecord, позволяя полностью сконфигурировать простой ACL внося изменения только в конфигурацию приложения.
Код: Выделить всё
interface UniqueEntityInterface
{
public function getUniqueId(): string;
}
Можно хранить ACL в Blob поле ActiveRecord у каждой отдельной сущности или создать таблицу связей из 3 полей (entity, subject, permList)
entity - entity->getUniqueId()
subject - (user:$userId|role:$roleName)
permList - сериализованный список permission
Резюме:
Если всё это сделать, мы сможем как в случае с RBAC просто подключить ACL в конфиге и без какого либо лишнего кода проверять доступ к Entity с помощью стандартного менеджера ACL (
function aclHasPermission($userId, string $permissionName, $entity, array $parameters = []): bool;).