Autenticación en Symfony3: Crear Login

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

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post