Приложения Symfony обычно проверяют права пользователя по фильтрам безопасности. Однако, если ваши потребности в области безопасности являются комплексными и включают в себя как человека, который запрашивает доступ и объект домена, доступ к которому запрашивается, возможно, потребуется использовать Symfony ACL (Список контроля доступа).
Основным недостатком ACL в том, что код, необходимый для работы с правами слишком объемный. Чтобы помочь вам управлять и отлаживать ACL, Symfony 2.6 представляет новую команду acl:set
.
После инициализации ACL init:acl
командой, вы можете использовать новую команду для предоставления прав для пользователей приложений. Например, следующая команда предоставляет права VIEW
пользователю на объекта MyClass с id = 42
:
$ php app/console acl:set --user=Symfony/Component/Security/Core/User/User:kevin VIEW Acme/MyClass:42
Аналогично, чтобы предоставить DELETE
, EDIT
и VIEW
разрешения пользователю на тот же объект, выполните следующую команду:
$ php app/console acl:set --user=Symfony/Component/Security/Core/User/User:kevin DELETE EDIT VIEW Acme/MyClass:42
acl:set
команда позволяет использовать опцию --role
, с тем чтобы предоставить разрешения для любого пользователя, которому присвоена определенная роль. Следующая команда устанавливает разрешение EDIT
для любого редактора приложения:
$ php app/console acl:set --role=ROLE_EDITOR EDIT Acme/MyClass:42
В предыдущих примерах использовалась object scope ACL, которая позволяет устанавливает права доступа для определенных объектов или экземпляров класса. Тем не менее, Symfony ACL поддерживает другие возможности для элементов управления доступом. Например class scope позволяет установить разрешения для всех объектов с того же класса.
Например, эта команда предоставляет пользователю разрешение владельца на любой объект класса Acme / MyClass:
$ php app/console acl:set --class-scope --user=Symfony/Component/Security/Core/User/User:anne OWNER Acme/MyClass:42
При использовании class scope, необходимо передать валидный id для типа класса (именно поэтому команда использует Acme / MyClass: 42 вместо Acme / MyClass). Более того, эти разрешения не применяется ко всем объектам того же класса, а только к объектам данного класса уже присутствующих в таблице ACL.