class DefaultController extends Controller { /** * Dashboard page. * @Permissions(perm="dashboard_view") * @Route("/", name="ITEDashboardBundle_index") * @Template() * @return array */ public function indexAction() {.......
namespace SomeNameSpace\SomeBundle\Annotations; /** * @Annotation */ class Permissions { public $perm; }
namespace SomeNamespace\SomeBundle\Annotations\Driver; use Doctrine\Common\Annotations\Reader;// use Symfony\Component\HttpKernel\Event\FilterControllerEvent;// use SomeNamespace\SomeBundle\Annotations;// use SomeNamespace\SomeBundle\Security\Permission; // permission to user use Symfony\Component\HttpFoundation\Response; // 403, use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; class AnnotationDriver{ private $reader; public function __construct($reader) { $this->reader = $reader;// } /** * */ public function onKernelController(FilterControllerEvent $event) { if (!is_array($controller = $event->getController())) { //, return; } $object = new \ReflectionObject($controller[0]);// $method = $object->getMethod($controller[1]);// foreach ($this->reader->getMethodAnnotations($method) as $configuration) { // if(isset($configuration->perm)){// , $perm = new Permission($controller[0]->get('doctrine.odm.mongodb.document_manager')); $userName = $controller[0]->get('security.context')->getToken()->getUser()->getUserName(); if(!$perm->isAccess($userName,$configuration->perm)){ // , 403 throw new AccessDeniedHttpException(); } } } } }
# SomeBundle\config\services.yml services: some_annotation_driver: class: SomeNamespace\SomeBundle\Annotations\Driver\AnnotationDriver # tags: [{name: kernel.event_listener, event: kernel.controller, method: onKernelController}] # arguments: [@annotation_reader] # annotation_reader
namespace SomeNamespace\SomeBundle\Controller; use SomeNamespace\SomeBundle\Annotations\Permissions; /** * Dashboard controller. * * @Route("/dashboard") */ class DefaultController extends Controller { /** * Dashboard page. * @Permissions(perm="dashboard_view") * @Route("/", name="ITEDashboardBundle_index") * @Template() * @return array */ public function indexAction() {...} }
Source: https://habr.com/ru/post/133270/
All Articles