轻松管理包和URL重写访问控制

时间:2017-03-27 16:27:25

标签: php symfony url-rewriting acl symfony2-easyadmin

我使用Easy Admin Bundle for Symfony 2,我在security.yml中设置ACL时遇到问题。它没有考虑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 }

或者可能有一些不同的方法?

1 个答案:

答案 0 :(得分:0)

好的,这是解决方案:

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');
    }
}