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

5 Comentarios

  1. Me gustaría configurar el login y registro en la misma pagina (dos forms) y tambien ponerle el captcha de google a cada form.
    ¿Como podría hacer esto?

    No logro hacer funcionar bien los dos captcha y el register tampoco me hace nada, el login si que me funciona.

    Responder
    • En el curso de Symfony3 hacemos un login y registro en la misma página, y lo de los captchas pues depende del plugin que uses. Revisate los videos en los que hacemos el login y registro en el curso. Saludos 😉

      Responder
  2. Ya he conseguido esto, ahora solo me queda el tema del captcha. Conoces algun bundle facil de implementar?

    Responder

Poner un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *