Atributo Method


1Presentación

Temma ofrece varios atributos para filtrar el acceso a controladores/acciones según el método HTTP (GET, POST, etc.). El atributo Method es bastante completo y versátil, pero Temma también proporciona atributos más simples y rápidos de usar.


2Method

Este atributo se usa para definir los métodos HTTP permitidos o prohibidos al acceder a un controlador o una acción.

Esto puede ser muy útil para proteger una acción contra fallos CSRF (forzando que una petición se haga como POST y no como GET), o para definir con precisión los métodos autorizados de una API.


2.1Parámetros

  • $allowed: (string|array) Método HTTP permitido, o lista de métodos permitidos.
  • $forbidden: (string|array) Método HTTP prohibido, o lista de métodos prohibidos.
  • $redirect: (string) URL a la que redirigir al usuario si el método no está autorizado.
  • $redirectVar: (string) Nombre de la variable de template que contiene la URL a la que redirigir al usuario.

2.2Prioridad

Para definir la URL a la que se redirigirá al usuario, el atributo aplica el siguiente orden de prioridad:

  1. Si el parámetro $redirect está definido, se usa.
  2. Si el parámetro $redirectVar está definido, y contiene el nombre de una variable de template existente y no vacía, se usa su contenido.
  3. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave methodRedirect, se usa su contenido.
  4. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave redirect, se usa su contenido.

Si no se encuentra ninguna URL de redirección, se devuelve un error 403.


2.3Configuración

Para asegurarte de que todos los atributos Method redirijan a la misma URL, basta con definirla en el archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'methodRedirect' => '/badAccess'
    ]
];

Para asegurarte de que la URL de redirección sea la misma para los atributos Auth, Method, Referer y Redirect, basta con definir la clave redirect en la configuración extendida x-security del archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'redirect' => '/login'
    ]
];

2.4Ejemplos

use \Temma\Attributes\Method as TµMethod;

/* todas las acciones del controlador solo pueden accederse mediante POST. */
#[TµMethod('POST')]
class Actions extends \Temma\Web\Controller {
    // ...
}
use \Temma\Attributes\Method as TµMethod;

class Actions extends \Temma\Web\Controller {
    // esta acción solo está disponible mediante GET
    #[TµMethod('GET')]
    public function getList() {
        // ...
    }

    // esta acción puede accederse mediante POST o PUT
    #[TµMethod(['POST', 'PUT'])]
    public function removeItem(int $id) {
        // ...
    }

    // esta acción puede accederse con cualquier método
    // excepto PATCH
    #[TµMethod(forbidden: 'PATCH')]
    public function defineItem(int $id, mixed $value) {
        // ...
    }

    // esta acción puede accederse con cualquier
    // método excepto HEAD y DELETE
    #[TµMethod(forbidden: ['HEAD', 'DELETE'])]
    public function fetchData() {
        // ...
    }
}

3Head, Get, Post, Put, Patch, Delete

Estos atributos son atajos que simplifican el uso del atributo Method. Especifican el método HTTP que debe usarse para acceder a un controlador o una acción.


3.1Parámetros específicos

Estos atributos no tienen parámetros.


3.2Prioridad de redirección

Cuando se accede a un controlador o una acción usando un método incorrecto (por ejemplo, se hace una petición GET a una acción configurada con el atributo \Temma\Attributes\Methods\Post), se puede definir una URL de redirección. Los atributos aplican el siguiente orden de prioridad:

  1. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave methodRedirect, se usa su contenido.
  2. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave redirect, se usa su contenido.

Si no se encuentra ninguna URL de redirección, se devuelve un error 403.


3.3Configuración específica

Para asegurarte de que todos los atributos Method redirijan a la misma URL, basta con definirla en el archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'methodRedirect' => '/badAccess'
    ]
];

Para asegurarte de que la URL de redirección sea la misma para los atributos Auth, Method, Referer y Redirect, basta con definir la clave redirect en la configuración extendida x-security del archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'redirect' => '/login'
    ]
];

3.4Ejemplos de atributos

use \Temma\Attributes\Methods\Head as TµHead;
use \Temma\Attributes\Methods\Get as TµGet;
use \Temma\Attributes\Methods\Post as TµPost;
use \Temma\Attributes\Methods\Put as TµPut;
use \Temma\Attributes\Methods\Patch as TµPatch;
use \Temma\Attributes\Methods\Delete as TµDelete;

class Actions extends \Temma\Web\Controller {
    // esta acción solo está disponible mediante HEAD
    #[TµHead]
    public function action1() { }

    // esta acción solo está disponible mediante GET
    #[TµGet]
    public function action2() { }

    // esta acción solo está disponible mediante POST
    #[TµPost]
    public function action3() { }

    // esta acción solo está disponible mediante PUT
    #[TµPut]
    public function action4() { }

    // esta acción solo está disponible mediante PATCH
    #[TµPatch]
    public function action5() { }

    // esta acción solo está disponible mediante DELETE
    #[TµDelete]
    public function action6() { }
}