Estoy trabajando en un pequeño proyecto respaldado por Doctrine2 que usa Symfony2 por primera vez. Actualmente estoy luchando con el componente de seguridad de symfony2, para ser exactos con el mecanismo de autenticación descrito en el documentation.Mecanismo de autenticación basado en Doctrine en el proyecto Symfony2
que desee utilizar una autenticación basada en formularios e hizo todo lo indicado en la documentación:
tengo un archivo de configuración security.yml que se parece a esto:
security.config:
firewalls:
admin:
pattern: /admin/.*
form-login: true
logout: true
login_path: /login
check_path: /validateLogin
always_use_default_target_path: false
target_path_parameter: target
check_page:
pattern: /validateLogin
form-login: true
login_path: /login
check_path: /validateLogin
always_use_default_target_path: false
target_path_parameter: target
public:
pattern: /.*
security: false
providers:
admin:
password_encoder: md5
entity:
class: AdminBundle:User
property: username
access_control:
- { path: /admin/.*, role: ROLE_ADMIN }
- { path: /validateLogin, role: IS_AUTHENTICATED_ANONYMOUSLY }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
El check_page se excluye de el área "sin seguridad" después de leer un hilo similar en devcomments.
En mi configuración de enrutamiento incluyo dos reglas para la autenticación:
_security_login:
pattern: /login
defaults:
_controller: PublicBundle:Auth:index
_security_check:
pattern: /validateLogin
La clase de entidad que estoy utilizando para representar a un usuario es una entidad Doctrine2 e implementa el AccountInterface:
<?php
namespace Application\AdminBundle\Entity;
use Symfony\Component\Security\User\AccountInterface;
/**
* @orm:Entity
*/
class User implements AccountInterface
{
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @orm:Column(type="string", length="255")
*/
protected $username;
/**
* @orm:Column(type="string", length="40")
*/
protected $password;
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getUsername()
{
return $this->username;
}
public function setUsername($username)
{
$this->username = $username;
}
public function getPassword()
{
return $this->password;
}
public function setPassword($password)
{
$this->password = $password;
}
/**
* Implementing the AccountInterface interface
*/
public function __toString()
{
return $this->getUsername();
}
public function getRoles()
{
return array('ROLE_ADMIN');
}
public function eraseCredentials()
{
}
public function getSalt()
{
return $this->getId();
}
}
En la clase AuthController estoy usando el código de ejemplo de los documentos symfony2:
public function indexAction()
{
if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
}
return
$this->render(
'PublicBundle:Auth:index.twig',
array(
'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
'error' => $error));
}
Ahora viene el problema: la regla de redirección de http://symfony2.localhost/app_dev.php/admin/test a http://symfony2.localhost/app_dev.php/login funciona pero después de ingresar el nombre de usuario/contraseña y enviar el formulario de inicio de sesión, me redirigen a la url de inicio de sesión nuevamente sin un mensaje de error.
Sé que esto es probablemente un problema realmente básico, pero como aún no hay mucha documentación sobre Symfony2, creo que este es un buen lugar para hacer preguntas como esta. En general, hay algunos puntos dentro de un proyecto symfony2 que parecen funcionar de forma mágica (por supuesto, con respaldo DI) que dificultan el proceso de aprendizaje. Mi opinión sobre cómo funciona la autenticación es que hay algún Controlador mágico que captura la acción validateLogin, busca un repositorio de entidad para mi entidad de usuario, llama a findOneBy ('nombre de usuario' => $ nombre de usuario) y compara las contraseñas ... es esto ¿derecho?
Gracias de antemano por cualquier sugerencia, he estado buscando en Google este tema para más algunas horas ahora ... :)
Paul
¡Guau, gracias por la respuesta! ¡Voy a intentar un honor más tarde! – Paul