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