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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/** * 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:
1 2 3 4 5 6 |
# Resources/config/services.yml services: 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.