Em segurança de aplicações web é uma preocupação séria, se sua aplicação não for suficiente para garantir que pode criar um problema sério. Então, como podemos assegurar que a nossa aplicação é segura? Há 2 projeto de segurança de Autenticação e Autorização. Autenticação : Autenticação é processado quando você usar suas credenciais (por exemplo. nome de usuário e senha) para acessar o sistema. Autorização : Após o processo de autenticação, a aplicação sabe quem vocês são. Mas você pode acessar determinados recursos do aplicativo, ou não, é a autorização. Symfony processo de autorização decide se quer ou não o usuário atual pode acessar alguns URI, ou modificar um determinado objeto. Existem 2 maneiras de ACL (e Eleitores), mas os Eleitores é uma solução mais fácil para executar essas restrições. Symfony de Eleitor é um mecanismo para fornecer acesso para o usuário atual para alguns recursos. O eleitor é uma classe que contém isGranted método onde escrevemos o nosso complexo de lógica de negócios que decide você tem permissão ou não para aceder a este URI, ou objeto. Todos os eleitores, chamados a cada vez que sempre que você chamou o isGranted método, você também pode passar um objeto para o isGranted método como um segundo argumento e o argumento vai passar para o eleitor. Vamos criar um cenário para o melhor entendimento dos eleitores, suponha que existe um ticket com o id #1000, que é atribuído ao Agente de Uma e o Agente B está tentando acessar esse bilhete, mas Agente B não tem permissão para acessar este bilhete. Criar, assim, um eleitor para superar esta situação. /** * Webkul Software. * * @category Webkul * @package Webkul_Uvdesk * @author Webkul * @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com) * @license https://store.webkul.com/license.html */ // Webkul/UvdeskBundle/Controller/TicketController; class TicketController extends Controller { public function viewAction(Request $request) { // ... $ticket = $this->getDoctrine()->getRepository('UvdeskBundle:Ticket')->find($id); $this->denyAccessUnlessGranted('VIEW_TICKET', $ticket); // ... } } 12345678910111213141516171819202122232425 /*** Webkul Software.** @category Webkul* @package Webkul_Uvdesk* @author Webkul* @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)* @license https://store.webkul.com/license.html*/ // Webkul/UvdeskBundle/Controller/TicketController; class TicketController extends Controller{ public function viewAction(Request $request) { // ... $ticket = $this->getDoctrine()->getRepository('UvdeskBundle:Ticket')->find($id); $this->denyAccessUnlessGranted('VIEW_TICKET', $ticket); // ... }} Acima controlador, vamos verificar se o usuário atual pode acessar este bilhete chamando o denyAccessUnlessGranted método do Symfony principal Controlador do Symfony\Bundle\FrameworkBundle\Controlador de espaço de nomes. Método denyAccessUnlessGranted é um simples isGranted método que chama o isGranted método e, se o usuário não está autorizado, em seguida, ele cria um acesso negado a exceção (403 proibido). Criar um bilhete de eleitor, onde temos que escrever a nossa lógica para restringir o que o usuário acessar o bilhete. /** * Webkul Software. * * @category Webkul * @package Webkul_Uvdesk * @author Webkul * @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com) * @license https://store.webkul.com/license.html */ // Webkul/UvdeskBundle/Security/TicketVoter; class TicketVoter extends AbstractVoter { private $attributesArray = array('VIEW_TICKET', 'DELETE_TICKET'); protected function supports($attribute, $subject) { // check if attribute is supportive if (!in_array($attribute, $attributesArray) { return false; } // Vote on Ticket object if (!$subject instanceof Ticket) { return false; } return true; } protected function getSupportedClasses() { return array('Webkul\UvdeskBundle\Entity\Ticket'); } protected function getSupportedAttributes() { return $this->attributesArray; } protected function isGranted($attribute, $ticket, $user = null) { $user = $token->getUser(); if (!$user instanceof User) { return false; } switch ($attribute) { case 'VIEW_TICKET': if($user->getRole() == 'ROLE_ADMIN' || $user == $ticket->getAgent()) return true; return false; case 'DELETE_TICKET': if($user->getRole() == 'ROLE_ADMIN') return true; return false; } } } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 /*** Webkul Software.** @category Webkul* @package Webkul_Uvdesk* @author Webkul* @copyright Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)* @license https://store.webkul.com/license.html*/ // Webkul/UvdeskBundle/Security/TicketVoter;class TicketVoter extends AbstractVoter{ private $attributesArray = array('VIEW_TICKET', 'DELETE_TICKET'); protected function supports($attribute, $subject) { // check if attribute is supportive if (!in_array($attribute, $attributesArray) { return false; } // Vote on Ticket object if (!$subject instanceof Ticket) { return false; } return true; } protected function getSupportedClasses() { return array('Webkul\UvdeskBundle\Entity\Ticket'); } protected function getSupportedAttributes() { return $this->attributesArray; } protected function isGranted($attribute, $ticket, $user = null) { $user = $token->getUser(); if (!$user instanceof User) { return false; } switch ($attribute) { case 'VIEW_TICKET': if($user->getRole() == 'ROLE_ADMIN' || $user == $ticket->getAgent()) return true; return false; case 'DELETE_TICKET': if($user->getRole() == 'ROLE_ADMIN') return true; return false; } } } No isGranted método, retorna true se o usuário atual tem acesso e false se não. Para fazer este eleitor trabalho, é preciso configurar este eleitor em seu serviço.yml arquivo. Abaixo está o código para a configuração do eleitor: # Resources/config/services.yml services: uvdesk.ticket_voter: class: Uvdesk\Security\TicketVoter tags: - { name: security.voter } 123456 # Resources/config/services.ymlservices: uvdesk.ticket_voter: class: Uvdesk\Security\TicketVoter tags: - { name: security.voter } É isso. Você pode escrever a sua própria lógica de negócios com base na sua necessidade. Você também pode verificar o Symfony Eleitores sobre o symfony documentação http://symfony.com/doc/current/security/voters.html Obrigado pelo seu tempo. Category(s) uvdesk