En este tutorial veremos como usar la autenticación en Symfony3 y como crear un login de usuarios.
En Symfony 3 la forma de hacer la autenticación ha cambiado bastante con respecto a Symfony2, así que veamos como se hacer un login.
En primer lugar entramos al fichero app/config/security.yml
security:
# En el caso que los usuarios tengan la contraseña cifrada configuramos los encoders para la entidad en la que estén los usuarios
encoders:
MiBundle\Entity\User:
algorithm: bcrypt
cost: 4
# En providers le indicamos que los usuarios van a salir de la base de datos y el username será email
providers:
our_db_provider:
entity:
class: MiBundle:User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# Configuramos el firewall main para indicarle el provider, la login_path, login_check y el path del logout
main:
anonymous: ~
provider: our_db_provider
form_login:
login_path: /login
check_path: /login_check
logout:
path: logout
target: /
En nuestro routing.yml configuramos las rutas principales, para el login y el logout.
login:
path: /login
defaults: { _controller: MiBundle:User:login }
login_check:
path: /login_check
logout:
path: /logout
En nuestra entidad definimos los métodos básicos para la autenticación.
public function getUsername()
{
return $this->email;
}
public function getSalt()
{
return null;
}
public function getRoles()
{
// En este caso definimos un rol fijo, en el caso de que tengamos un campo role en la tabla de la BBDD tendríamos que hacer $this->getRole()
return array('ROLE_USER');
}
public function eraseCredentials()
{
}
También tendrás que implementar la interface UserInterface en tu entidad.
use Symfony\Component\Security\Core\User\UserInterface;
/**
* User
*/
class User implements UserInterface{
En nuestro controlador tendremos la acción login. Las rutas login_check y logout funcionan de forma automática con el sistema de autenticación de Symfony3, no tenemos que crear ninguna acción:
public function loginAction(Request $request) {
//Llamamos al servicio de autenticacion
$authenticationUtils = $this->get('security.authentication_utils');
// conseguir el error del login si falla
$error = $authenticationUtils->getLastAuthenticationError();
// ultimo nombre de usuario que se ha intentado identificar
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'MiBundle:user:login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
En la vista pintamos el formulario cuyo action lleva a login_check.
{% extends "MiBundle::layout.html.twig" %}
{% block primary %}
{% if is_granted('ROLE_USER') or is_granted('ROLE_ADMIN') %}
{{app.user.name}} {{app.user.surname}} {{app.user.email}} {{ app.user.role }}
{%endif%}
<form action="{{ path('login_check') }}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" />
<label for="password">Password:</label>
<input type="password" id="password" name="_password" />
{#
Si quieres controlar la url a la que el usuario
es redirigido al enviar correctamente el formulario
<input type="hidden" name="_target_path" value="/account" />
#}
<button type="submit">login</button>
</form>
{% endblock %}
Ya tenemos el login listo para ser usado.
Más información:
http://symfony.com/doc/current/cookbook/security/form_login_setup.html













