El tutorial Jobeet

13.3. La seguridad de la aplicación

13.3.1. Autenticación

La seguridad de las aplicaciones Symfony se controla mediante un archivo en formato YAML llamado security.yml. Si quieres ver la configuración por defecto de la seguridad de la aplicación backend, puedes acceder al archivo config/security.yml de la aplicación:

# apps/backend/config/security.yml
default:
  is_secure: off

Si cambias el valor de la opción is_secure a on, la aplicación backend requerirá a partir de ese momento que los usuarios estén autenticados.

Pantalla que muestra que el usuario debe estar autenticado

Figura 13.3 Pantalla que muestra que el usuario debe estar autenticado

Nota En los archivos YAML, los valores booleanos se pueden indicar con las cadenas de texto true y false o con los valores on y off.

Si echas un vistazo a los mensajes de log de la barra de depuración web, verás que cada vez que intentas acceder a una página de la aplicación backend se ejecuta el método executeLogin() de la clase defaultActions.

Mensajes de la barra de depuración web relacionados con el login

Figura 13.4 Mensajes de la barra de depuración web relacionados con el login

Cuando un usuario que no ha sido autenticado intenta acceder a una acción restringida, Symfony reenvía la petición a la acción de login configurada en el archivo settings.yml:

all:
  .actions:
    login_module: default
    login_action: login

Nota No es posible restrigir la seguridad de la acción login para evitar recursiones infinitas.

Nota Como vimos en el tutorial del día 4, un mismo archivo de configuración se puede definir en diferentes directorios. Este también es el caso del archivo security.yml. Si sólo quieres restringir o permitir el acceso a una acción o a un módulo, crea un archivo llamado security.yml en el directorio config/ de ese módulo:

index:
  is_secure: off

all:
  is_secure: on

La clase myUser hereda por defecto de sfBasicSecurityUser y no de sfUser. La clase sfBasicSecurityUser incluye métodos adicionales para gestionar la autenticación y autorización de usuarios.

Si quieres controlar la autenticación de los usuarios, puedes utilizar los métodos isAuthenticated() y setAuthenticated():

if (!$this->getUser()->isAuthenticated())
{
  $this->getUser()->setAuthenticated(true);
}

13.3.2. Autorización

Además de la autenticación de los usuarios, se puede restringir todavía más el acceso a algunas acciones mediante la definición de credenciales. Para acceder a una página determinada, el usuario debe contar con ciertas credenciales:

default:
  is_secure:   off
  credentials: admin

El sistema de credenciales de Symfony es bastante sencillo pero muy poderoso. Cada credencial puede representar cualquier cosa que requiera el modelo de seguridad de tu aplicación (como por ejemplo grupos o permisos).

La clase sfBasicSecurityUser incluye varios métodos para gestionar las credenciales de los usuarios:

// Add one or more credentials
$user->addCredential('foo');
$user->addCredentials('foo', 'bar');

// Check if the user has a credential
echo $user->hasCredential('foo');                      =>   true

// Check if the user has both credentials
echo $user->hasCredential(array('foo', 'bar'));        =>   true

// Check if the user has one of the credentials
echo $user->hasCredential(array('foo', 'bar'), false); =>   true

// Remove a credential
$user->removeCredential('foo');
echo $user->hasCredential('foo');                      =>   false

// Remove all credentials (useful in the logout process)
$user->clearCredentials();
echo $user->hasCredential('bar');                      =>   false

En la parte de administración de Jobeet no vamos a utilizar credenciales porque sólo tenemos un perfil de usuario: el administrador.