Symfony2 рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ MongoDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ ACL рдХреЛ рдЬрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ ACL рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рддреЛ, рдпрд╣рд╛рдБ рд╣рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:
class DefaultController extends Controller { public function indexAction() {.......
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдорд╛рд░реНрдЧ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдиреЛрдЯреЗрд╢рди рдорд╛рдирдХ рд╣реИрдВ рдФрд░ рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдХрд░реНрдиреЗрд▓ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирдпрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ:
namespace SomeNameSpace\SomeBundle\Annotations; class Permissions { public $perm; }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдиреЛрдЯреЗрд╢рди @ рдкрд┐рдПрд░реНрд╕ рдХрд╛ рд╣реЛрдЧрд╛ (perm = "some_value")
рд╣рдорд╛рд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВрдЧреЗред
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(); } } } } }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╡рд╛рдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдЬ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд┐рдореНрдлрдиреА 2 рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рдмрди рдЧрдпрд╛ рд╣реИред
рд╣рд╛рдВред рдФрд░ рдЖрдЦрд┐рд░реА рдХрджрдо, рд▓реЗрдХрд┐рди рдХреЛрдИ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВред рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рдЙрдВрдЯрд░-рд╣реБрдХ рд╣реБрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ: EventListener
# 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; class DefaultController extends Controller { public function indexAction() {...} }
UPD: рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж
sHINE