48K Views

Symfony Seguridad De Los Votantes

En la seguridad de aplicaciones web es una preocupación seria, si su solicitud no es suficiente para garantizar que se puede crear un grave problema. Entonces, ¿cómo podemos asegurar que nuestra aplicación está protegida? Hay 2 diseño de la seguridad de la Autenticación y la Autorización.

Autenticación : Autenticación se procesa cuando utilice sus credenciales (por ejemplo. nombre de usuario y contraseña) para acceder al sistema.

Autorización : Después de que el proceso de autenticación, la aplicación sabe quiénes son. Pero puede usted acceder a determinados recursos de la aplicación o no de la autorización.

Symfony proceso de autorización decide si procede o no que el usuario pueda acceder a algunas de las URI, o modificar un determinado objeto. Hay 2 maneras (ACL y los Votantes), pero los Votantes es una solución más sencilla para realizar estas restricciones.

Symfony Votante es un mecanismo para proporcionar acceso al usuario actual de algunos recursos. El votante es una clase que contiene isGranted método donde escribimos nuestra lógica de negocio complejo que decide que usted tiene permiso o no para acceder a este URI, o el objeto.

Todos los votantes que se llama cada vez cuando llama el isGranted método, también se puede pasar un objeto a la isGranted método como un segundo argumento y que el argumento va a pasar con el votante.

Vamos a crear un escenario para la mejor comprensión de los votantes, supongamos que hay un ticket con id #1000 el cual es asignado al Agente y Agente B está tratando de acceder a este billete, pero el Agente B no tiene permiso para acceder a esta entrada.

Para crear un votante para superar esta situación.

/**
* 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);

       // ...
   }
}

En el anterior controlador, debemos comprobar si el usuario actual puede tener acceso a esta entrada llamando a la denyAccessUnlessGranted método de núcleo de Symfony Controlador de Symfony\Bundle\FrameworkBundle\Controller espacio de nombres. Método denyAccessUnlessGranted es una sencilla isGranted método que llama a la isGranted método y si el usuario no está autorizado a continuación, se crea un acceso denegado excepción (403 (prohibido).

Crear un ticket de votantes donde tenemos que escribir nuestra lógica para restringir el acceso al usuario a la entrada.

/**
* 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; 
       } 
   } 
}

En el isGranted método, que nos devolverá true si el usuario actual tiene acceso, y false si no.

Para hacer este votante de trabajo, usted necesita configurar este votante en su servicio.fichero yaml. A continuación se muestra el código para la configuración de los votantes:

# Resources/config/services.yml
services:
   uvdesk.ticket_voter:
        class: Uvdesk\Security\TicketVoter
        tags:
            - { name: security.voter }

Eso es todo. Usted puede escribir su propia lógica de negocio basado en su necesidad.

También puede comprobar Symfony Votantes en la documentación de symfony http://symfony.com/doc/current/security/voters.html

Gracias por su tiempo.

Category(s) uvdesk
. . .

Comment

Add Your Comment

Be the first to comment.

css.php