Atributo Auth
1Presentación
Este atributo se usa para gestionar cómo se puede acceder a un controlador o una acción, en función de la autenticación del usuario, los roles que tiene asignados y los servicios a los que tiene derecho de acceso.
2Variable de template $currentUser
Este atributo se basa en la existencia de una variable de template $currentUser, que contiene información sobre el usuario desde el momento en que inicia sesión. Esta variable normalmente la define un pre-plugin.
La variable $currentUser debe ser un array asociativo que contenga las siguientes claves:
- id: (int) Identificador del usuario. Debe estar definido cuando el usuario está autenticado.
- roles: (array) Array asociativo cuyas claves son los roles del usuario (asociadas al valor true).
- services: (array) Array asociativo cuyas claves son los servicios a los que el usuario tiene acceso (asociadas al valor true).
3Parámetros
El atributo ofrece varios parámetros:
- $role: (string|array) Rol que debe tener el usuario, o lista de roles (el usuario debe tener al menos uno). Si un rol empieza con un guion (-), el usuario no debe tener ese rol.
- $service: (string|array) Servicio al que el usuario debe tener acceso, o lista de servicios (el usuario debe tener acceso al menos a uno de ellos). Si un servicio empieza con un guion (-), el usuario no debe tener acceso a ese servicio.
-
$authenticated: (null|bool)
El efecto de este parámetro depende de su valor:
- true: (valor por defecto) El usuario debe estar autenticado para acceder al controlador o la acción.
- false: El usuario no debe estar autenticado.
- null: El usuario puede estar autenticado o no.
- $redirect: (string) URL a la que redirigir si el usuario no está autorizado a acceder al controlador o la acción.
- $redirectVar: (string) Nombre de la variable de template que contiene la URL a la que redirigir al usuario.
- $storeUrl: (bool) Pon el valor true para que la URL solicitada se guarde en la variable de sesión authRequestedUrl, cuando el usuario es redirigido por no estar autorizado. Esta variable puede usarse después de la autenticación para devolver al usuario a la página a la que quería acceder.
4Prioridad de redirección
Si se deniega el acceso, el usuario puede ser redirigido. Para determinar la URL de redirección, el atributo aplica el siguiente orden de prioridad:
- Si el parámetro $redirect está definido, se usa.
- 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.
- Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave authRedirect, se usa su contenido.
- 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 401.
5Configuración
Para asegurarte de que todos los atributos Auth redirijan a la misma URL, basta con definir la clave authRedirect en la configuración extendida x-security del archivo etc/temma.php:
<?php
return [
'x-security' => [
'authRedirect' => '/login'
]
];
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'
]
];
Si tienes tu propio mecanismo de autenticación (y por lo tanto no usas el controlador/plugin Auth proporcionado por Temma), es posible que quieras usar una variable de template que no se llame $currentUser. En este caso, puedes redefinir el nombre de la variable que debe usar el atributo, definiendo la clave authVariable en la configuración extendida x-security; la variable solo necesita ser un array asociativo que contenga al menos la clave id.
<?php
return [
'x-security' => [
'authVariable' => 'currentOrganization'
]
];
6Ejemplos
use \Temma\Attributes\Auth as TµAuth;
/*
* Las acciones de este controlador solo son accesibles
* para usuarios autenticados.
*/
#[TµAuth]
class Account extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Auth as TµAuth;
/*
* Las acciones solo son accesibles para usuarios no
* autenticados, con una redirección a la página
* de inicio.
*/
#[TµAuth(authenticated: false, redirect: '/')]
class Login extends \Temma\Web\Controller {
// ...
}
use \Temma\Attributes\Auth as TµAuth;
class Login extends \Temma\Web\Controller {
// autorizado para usuarios con el rol "manager"
#[TµAuth('manager')]
public function action1() { }
// igual que el anterior
#[TµAuth(role: 'manager')]
public function action1bis() { }
// autorizado para usuarios con el rol "manager" o "writer"
#[TµAuth(['manager', 'writer'])]
public function action2() { }
// igual que el anterior
#[TµAuth(role: ['manager', 'writer'])]
public function action2bis() { }
// prohibido para usuarios con el rol "rookie"
#[TµAuth('-rookie')]
public function action3() { }
// autorizado para usuarios con el rol manager, pero sin el rol "rookie"
#[TµAuth(['manager', '-rookie'])]
public function action4() { }
// autorizado para usuarios con acceso al servicio "images"
#[TµAuth(service: 'images')]
public function action5() { }
// autorizado para usuarios con acceso al servicio "images" o "text"
#[TµAuth(service: ['images', 'text'])]
public function action6() { }
// prohibido para usuarios con acceso al servicio "video"
#[TµAuth(service: '-video')]
public function action7() { }
// autorizado para usuarios que tengan los roles "manager"
// y "writer" al mismo tiempo
#[TµAuth('manager')]
#[TµAuth('writer')]
public function action8() { }
// redirige a los usuarios que no son administradores
#[TµAuth('admin', redirect: '/login')]
public function action9() { }
}
7Variables flash
Cuando el atributo Auth impide el acceso a un controlador o una acción, y realiza una redirección, registra el motivo del bloqueo en una variable flash llamada __authError.
Esta variable puede contener los siguientes valores:
- not_authenticated: el usuario no está autenticado, pero debe estarlo para acceder al recurso.
- authenticated: el usuario está autenticado, pero no necesita estarlo para acceder al recurso.
- no_role: el usuario no tiene ninguno de los roles requeridos.
-
forbidden_role: el usuario tiene un rol prohibido.
La variable flash __authErrorData contiene el nombre del primer rol prohibido encontrado. - no_service: el usuario no tiene acceso a ninguno de los servicios requeridos.
-
forbidden_service: el usuario tiene acceso a un servicio prohibido.
La variable flash __authErrorData contiene el nombre del primer servicio prohibido encontrado.