Hola, estoy intentando con Symfony hacer un login de usuarios, en principio parece como si funcionara bien, tiene su formulario de login, si pongo mal el usuario y la clave me vuelve a mandar al formulario diciendome que las credenciales estan mal, y si las pongo bien me redirige al inicio de la web, hasta ahi bien, el problema es que en la barra de depuración del entorno de desarrollo siempre aparece como sin usuario autenticado, y si intento en la pagina principal obtener el usuario para mostrar el nombre de usuario logueado al inicio, para ver si esta logueandome, pues nunca me aparece, es como si me autenticara bien pero luego olvidara las credenciales, no entiendo por que sucede. ¿Alguna idea?
Estoy primero especificando los usuarios en el archivo de configuracion, pues es la primera vez que uso Symfony, pero luego la idea es que cuando esto funcione pasar a usar usuarios en la base de datos.
Este es el archivo security.yml:
Código:
jms_security_extra:
secure_all_services: false
expressions: true
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/login$
security: false
secured_area:
pattern: ^/(secured/.*|login_check)
form_login:
check_path: /login_check
login_path: /login
logout:
path: /logout
target: /
#anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
access_control:
#- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
Y este el archivo de route.yml:
Código:
compartida_compartida:
resource: "@CompartidaCompartidaBundle/Resources/config/routing.yml"
prefix: /
login_check:
pattern: /login_check
login:
pattern: /login
defaults: { _controller:CompartidaCompartidaBundle:Security:login }
logout:
pattern: /logout
El controlador del formulario de login:
Código:
<?php
namespace Compartida\CompartidaBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;
class SecurityController extends Controller
{
public function loginAction()
{
$peticion = $this->getRequest();
$sesion = $peticion->getSession();
// obtiene el error de inicio de sesión si lo hay
if ($peticion->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $peticion->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = $sesion->get(SecurityContext::AUTHENTICATION_ERROR);
}
return $this->render('CompartidaCompartidaBundle:Security:login.html.twig', array(
// el último nombre de usuario ingresado por el usuario
'ultimo_nombreusuario' => $sesion->get(SecurityContext::LAST_USERNAME),
'error' => $error,
));
}
}
?>
La plantilla del formulario de login:
Código:
{% extends 'CompartidaCompartidaBundle::base.html.twig' %}
{% block main %}
{% if error %}
<p>{{ error.message }}</p>
{% endif %}
<form action="{{ path('login_check') }}" method="post">
<label for="nombreusuario">Nombre:</label>
<input type="text" id="nombreusuario" name="_username" value="{{ ultimo_nombreusuario }}" />
<label for="password">Password:</label>
<input type="password" id="password" name="_password" />
<input type="submit" name="login" />
</form>
{% endblock %}
{% block login %}{% endblock %}