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
17 marzo, 2016
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.
17 marzo, 2016
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 😉
17 marzo, 2016
Gracias, luego los reviso entonces. Lo del captcha uso el de google de yo no soy robot. https://www.google.com/recaptcha/intro/index.html
seguiré probando a ver.
17 marzo, 2016
Ya he conseguido esto, ahora solo me queda el tema del captcha. Conoces algun bundle facil de implementar?
18 marzo, 2016
Genial!! Tienes este bundle para captchas que está bastante bien y soporta Symfony3: https://github.com/Gregwar/CaptchaBundle