Probleme beim Erstellen einer automatisierten Berechtigungskontrolle + Menü + Breadcrumbs in Symfony2
PHPz
PHPz 2017-05-16 16:44:27
0
1
582

Ich habe andere Frameworks wie TP und CI verwendet, um die oben genannten Anforderungen zu erfüllen, und dies ist leicht zu realisieren. Kürzlich möchte ich es auch auf SF2 implementieren und ein adminBundle schreiben, um automatisch ein Backend zu erstellen, das allgemeine Funktionen bereitstellt. Allerdings bin ich auf folgendes Problem gestoßen:
Da ich Benutzerzugriffsberechtigungen global im Hintergrund erkennen möchte, habe ich vor dem Auslösen jedes Controllers die Anforderungsinformationen abgehört und überprüft, ob der Benutzer die entsprechenden Berechtigungen erteilt hat. Der Code lautet wie folgt:

class RunActListener { protected $securityContext; public function __construct(SecurityContextInterface $securityContext) $this->securityContext = $securityContext; } public function onRunAct(FilterControllerEvent $event) { $request = $event->getRequest(); $ajax = $request->isXmlHttpRequest(); if (preg_match('/^\/admin/', $request->getRequestUri())) { $routeName = $request->get('_route'); if ($this->securityContext->isGranted(array($routeName))) { } else { $reffeer = $request->server->get('HTTP_REFERER'); $data['info'] = '您没有权限操作!'; $data['status'] = false; if ($ajax) { $event->setController( function() use ($data) { return new JsonResponse($data); }); } else { $event->setController( function() use ($data) { return new Response('您没有足够的访问权限!'); }); //。。。。。

Dann habe ich 2 Renderings im Hintergrundlayout eingeführt. Die Menü- und Breadcrumb-Codes lauten wie folgt:

   

{% block main %} {% endblock %}

Auf diese Weise werden zwei Unteranfragen initiiert, aber meine Anforderung besteht darin, die URL der übergeordneten Anfrage in der Unteranfrage abzurufen, um meine Breadcrumbs und mein Menü zu implementieren. Es gibt einige Probleme in SF. Jemand hat vorgeschlagen, den Anforderungsstapel in der Unteraktion abzurufen

/** * 显示面包屑 * @return type */ public function showCrumbAction() { $request = $this->container->get('request'); $path = $request->server->get('REDIRECT_URL'); $path_arr = explode('/', $path); $path_len = count($path_arr); $top_index = (int) ($path_len - 2); $path_top = $path_arr[$top_index]; $route_arr = $this->get('router')->match($path); $route = $route_arr['_route']; $em = $this->getDoctrine()->getManager(); //获取菜单结果集 $top_menu = $em->getRepository('CwpUtilBundle:Menu')->findOneByNode($path_top); $sec_menu = $em->getRepository('CwpUtilBundle:Menu')->findOneByNode($route); return $this->render('CwpUtilBundle:Layout:crumb.html.twig', array( 'top_menu' => $top_menu, 'sec_menu' => $sec_menu, )); }

Ich habe versucht, request_stack in der obigen Aktion abzurufen, aber sobald ich es bekomme, scheint es, dass in dieser Aktion eine Anfrage initiiert wurde, mein Listener ausgelöst und dann anders ausgeführt wurde, was zur Meldung führt, dass Sie nicht über ausreichende Berechtigungen verfügen. Ich war verwirrt und wusste nicht warum.

PHPz
PHPz

学习是最好的投资!

Antworte allen (1)
伊谢尔伦

监听kernel.controller的那个listener,加个判断,仅在主请求时才检查权限就可以了:

if ($event->isMasterRequest()) { // 才做检查 }

2.3的FilterControllerEvent没这个方法,参考这个逻辑自己写就可以了:
https://github.com/symfony/symfony/blob/2.7/src/Symfony/Component/HttpKernel/Event/KernelEvent.php#L100

    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!