Problème avec Symfony2 créant un contrôle d'autorisation automatisé + menu + fil d'Ariane
PHPz
PHPz 2017-05-16 16:44:27
0
1
583

J'utilise d'autres frameworks tels que TP et CI pour répondre aux exigences ci-dessus, et cela peut être facilement réalisé. Récemment, je souhaite également l'implémenter sur SF2 et écrire un adminBundle pour créer automatiquement un backend pour fournir des fonctions communes. Cependant, j'ai rencontré le problème suivant :
Puisque je souhaite détecter les autorisations d'accès des utilisateurs globalement en arrière-plan, j'ai écouté le contrôleur pour obtenir les informations de demande avant le déclenchement de chaque contrôleur et vérifier si l'utilisateur a accordé les autorisations correspondantes. Le code est le suivant :

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('您没有足够的访问权限!'); }); //。。。。。

Ensuite, j'ai introduit 2 rendus dans la mise en page en arrière-plan. Les codes de menu et de fil d'Ariane sont les suivants :

   

{% block main %} {% endblock %}

De cette façon, 2 sub_requests sont initiées, mais mon exigence est d'obtenir l'url de la requête parent dans la sub_request pour implémenter mon fil d'Ariane et mon menu. Il y a quelques problèmes dans SF. Quelqu'un a suggéré d'utiliser la pile de requêtes dans la sous-action

.
/** * 显示面包屑 * @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, )); }

J'ai essayé d'obtenir request_stack dans l'action ci-dessus, mais une fois que je l'ai reçu, il semble qu'une requête ait été lancée dans cette action, mon écouteur a été déclenché, puis exécuté autrement, en sautant à l'invite indiquant que vous disposez d'autorisations insuffisantes. J'étais confus et je ne savais pas pourquoi.

PHPz
PHPz

学习是最好的投资!

répondre à tous (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

    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!