¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

La seguridad

Introducción

No puede pasar por alto la seguridad de una aplicación, especialmente si tiene responsabilidades en la administración de su sitio web.

Pero no se preocupe: implementar la seguridad en Symfony no es muy complicado. Todo está instalado por defecto.

Hay dos partes distintas en cuanto a seguridad:

  • autenticación: se refiere a cómo un usuario puede iniciar sesión para acceder a una parte segura de la aplicación.

  • autorización: se refiere a cómo definir los permisos para que un usuario acceda a ciertos recursos, como rutas, controladores, métodos, vistas y entidades.

Comenzaremos con la autenticación de un usuario.

La autenticación

Toda la seguridad de Symfony se concentra en un solo archivo: config/packages/security.yaml.

Abra este archivo:

security:  
    # https://symfony.com/doc/current/security.html#registering-the- 
user-hashing-passwords 
    password_hashers: 
        Symfony\Component\Security\Core\User\PasswordAuthenticated 
UserInterface: 'auto' 
    # https://symfony.com/doc/current/security.html#loading-the-user- 
the-user-provider  
    providers:  
        users_in_memory: { memory: null }  
    firewalls:  
        dev:  
            pattern: ^/(_(profiler|wdt)|css|images|js)/  
            security: false  
        main:  
            lazy: true  
            provider: users_in_memory  
  
            # activate different ways to authenticate  
            # https://symfony.com/doc/current/security.html#the-firewall 
  
            # https://symfony.com/doc/current/security/ 
impersonating_user.html 
            # switch_user: true 
  
    # Easy way to control access for large sections of your site 
    # Note: Only the *first* access control that matches will be used 
    access_control: 
        # - { path: ^/admin, roles: ROLE_ADMIN } 
        # - { path: ^/profile, roles: ROLE_USER } 
  
when@test:  
    security:  
        password_hashers:  ...

La autorización

Una vez que un usuario está definido como poseedor de los derechos para autenticarse, es necesario especificarle a qué recursos tiene acceso.

Actualmente, el firewall definido (main) permite el acceso a todo el mundo:

main:  
         lazy: true  
         provider: app_user_provider  
         custom_authenticator: App\Security\CustomAuthenticator  
         logout:  
         path: app_logout  
  

lazy: true simplemente significa que no es necesario iniciar una sesión de autorización en caso de que no haya una solicitud explícita de autorización. La sesión que proporcionará una identificación de sesión para seguridad se creará dinámicamente cuando se acceda a los recursos que están protegidos.

En otras palabras, actualmente todo el mundo tiene acceso a todos los recursos de nuestra aplicación. De hecho, deseamos dar acceso a las páginas frontales de nuestra aplicación sin activar la seguridad. Solo las páginas de administración deben estar protegidas.

Vamos a definir permisos de acceso para algunos recursos.

Existen varios tipos de autorizaciones:

  • access_control: permite definir autorizaciones a nivel de las rutas.

  • acceso controlador: permite definir autorizaciones a nivel de un controlador.

  • acceso a la acción: permite definir autorizaciones a nivel de los métodos de un controlador.

  • acceso a la vista: permite definir autorizaciones a nivel de las vistas.

Comenzaremos con las autorizaciones de control de acceso.

1. access_control

Actualmente, todos nuestros usuarios tienen acceso a las rutas insert, update y delete

Para usar la identificación establecida en estas rutas, utilizaremos el control de acceso (access_control).

Los controles de acceso se definen en el archivo config/packages/security.yaml. Al final del archivo, encontrará estas líneas:

  access_control:  
        # - { path: ^/admin, roles: ROLE_ADMIN }  
        # - { path: ^/profile, roles: ROLE_USER...

La seguridad de una API

Hay muchas otras configuraciones de seguridad disponibles en Symfony. Le recomiendo que consulte la página de documentación si desea profundizar más: https://symfony.com/doc/current/security.html

Hay una seguridad particular que debe implementarse cuando la aplicación Symfony es de tipo API.

¿Qué es una API?

Una API (Application Programming Interface) permite a los desarrolladores utilizar una funcionalidad (una clase PHP) sin tener que preocuparse por su funcionamiento. Esto se llama servicios externos. Una API ofrece, de forma remota, un servicio a otro programa.

Las API pueden, por ejemplo, usarse para activar campañas publicitarias por correo electrónico de forma automática, acceder a datos de una base de datos...

El acceso a una API se realiza simplemente mediante una solicitud HTTP, pero no devuelve una página HTML como una aplicación estándar. Por lo general, una API devuelve datos (ya sea un código de respuesta que indique si el servicio se ha ejecutado correctamente, o información en el caso de una búsqueda en una base de datos, por ejemplo).

El formato de datos devuelto por una API es, generalmente, el formato JSON. Utilizamos API llamadas REST, es decir, basadas en solicitudes HTTP. También existen otros tipos de API, como las API de tipo SOAP, basadas en un intercambio de datos a partir de un archivo XML.

He aquí un ejemplo de cómo se presentan los datos en formato JSON:

{  
  "especie": "Perro",  
  "raza": "Labrador Retriever",  
  "color": "Amarillo",  
  "edad": 6  
} 

Este formato se deriva directamente del aspecto de los objetos en JavaScript.

Su navegador puede leer archivos JSON, pero, generalmente, no puede ejecutar una API (no está diseñado para eso, si bien suele ser capaz de mostrar los datos).

Una API utiliza varios métodos de conexión HTTP según lo que haga. Son convenciones, pero todas las API las adoptan.

Los principales métodos son:

  • GET: para recuperar información

  • POST: para crear información

  • PUT: para actualizar la información existente

  • DELETE: para eliminar información

Puede crear un programa PHP para acceder a una API siguiendo los diferentes...