Sto lavorando per la prima volta su un piccolo progetto supportato da Doctrine2 utilizzando Symfony2. Attualmente sto lottando con il componente di sicurezza di symfony2, per essere precisi con il meccanismo di autenticazione descritto nello documentation.Meccanismo di autenticazione basato su Doctrine nel progetto Symfony2
voglio utilizzare l'autenticazione basata su form e ha fatto tutto dichiarato nella documentazione:
ho un file di configurazione security.yml che assomiglia a questo:
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
Il check_page è escluso dalla l'area "senza protezione" dopo aver letto un thread simile su devcomments.
Nella mia configurazione del routing includo due regole per l'autenticazione:
_security_login:
pattern: /login
defaults:
_controller: PublicBundle:Auth:index
_security_check:
pattern: /validateLogin
La classe entità che sto usando per rappresentare un utente è un'entità Doctrine2 e implementa l'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();
}
}
In la classe AuthController Sto usando il codice di esempio dai documenti 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));
}
Ora viene il problema: la regola di reindirizzamento da http://symfony2.localhost/app_dev.php/admin/test a http://symfony2.localhost/app_dev.php/login funziona ma, dopo aver immesso nome utente/password e inoltrato il modulo di accesso, vengono nuovamente reindirizzati all'URL di accesso senza un messaggio di errore.
So che questo è probabilmente un problema di base ma poiché non c'è ancora molta documentazione su symfony2, penso che questo sia un buon posto per fare domande come questa. In generale ci sono alcuni punti all'interno di un progetto symfony2 che sembrano funzionare magicamente (ovviamente con DI-backed) che rendono il processo di apprendimento un po 'difficile. Il mio pensiero su come funziona l'autenticazione è che c'è un controller magico che cattura l'azione validateLogin, cerca un repository di entità per la mia entità User, chiama findOneBy ('username' => $ username) e confronta le password ... è questo destra?
Grazie in anticipo per qualsiasi suggerimento, ho googling questo problema per più qualche ora ora ... :)
Paul
Wow, grazie per la risposta! Cercherò un onore più tardi! – Paul