Я использую Easy Admin Bundle для Symfony 2, и у меня проблема с настройкой ACL в security.yml. Он не учитывает параметры URL, поэтому мне нужно переписать URL.
Текущий:
.../admin/?entity=User&action=list&menuIndex=0&submenuIndex=-1
Вот что мне нужно:
.../admin/User/?action=list&menuIndex=0&submenuIndex=-1
После этого легко настроить ACL из:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
Для чего-то вроде:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/files/, role: ROLE_USER }
- { path: ^/admin/user/, role: ROLE_ADMIN }
Или же:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_USER }
- { path: ^/files/, role: ROLE_USER }
- { path: ^/user/, role: ROLE_ADMIN }
Или, может быть, есть другой подход?
Хорошо, вот решение:
https://github.com/javiereguiluz/EasyAdminBundle/issues/1076
Просто отредактируйте ваш config.yml, как в примере:
BlogEntry:
class: AppBundle\Entity\BlogEntry
permissions:
list: ['ROLE_ADMIN', 'ROLE_EDITOR']
create: ['ROLE_ADMIN']
edit: ['ROLE_ADMIN', 'ROLE_EDITOR']
delete: ['ROLE_ADMIN']
Затем перезапишите EasyAdmin AdminController и перезапишите метод indexAction:
namespace AppBundle\Controller;
use JavierEguiluz\Bundle\EasyAdminBundle\Controller\AdminController as EasyAdminController;
class AdminController extends EasyAdminController
{
/**
* @Route("/", name="easyadmin")
*
* @param Request $request
*
* @return RedirectResponse|Response
*/
public function indexAction(Request $request)
{
$this->initialize($request);
if (null === $request->query->get('entity')) {
return $this->redirectToBackendHomepage();
}
$action = $request->query->get('action', 'list');
if (!$this->isActionAllowed($action)) {
throw new ForbiddenActionException(array('action' => $action, 'entity' => $this->entity['name']));
}
if (isset($this->entity['permissions'][$action])) {
$this->denyAccessUnlessGranted($this->entity['permissions'][$action]);
}
return $this->executeDynamicMethod($action.'<EntityName>Action');
}
}
Других решений пока нет …