Я работаю над небольшим проектом, поддерживающим Doctrine2, с использованием Symfony2 в первый раз. В настоящее время я борюсь с компонентом безопасности symfony2, точнее с механизмом аутентификации, описанным в документации .
Я хочу использовать аутентификацию на основе форм и сделал все, что указано в документах:
У меня есть файл конфигурации security.yml, который выглядит следующим образом:
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
Страница check_page исключается из области "без безопасности" после прочтения аналогичного потока на devcomments.
В моей конфигурации маршрутизации я включаю два правила аутентификации:
_security_login:
pattern: /login
defaults:
_controller: PublicBundle:Auth:index
_security_check:
pattern: /validateLogin
Класс сущности, который я использую для представления пользователя, является объектом Doctrine2 и реализует 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();
}
}
В классе AuthController я использую код примера из документов 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));
}
Теперь возникает проблема: правило перенаправления от http://symfony2.localhost/app_dev.php/admin/test до http://symfony2.localhost/app_dev.php/login работает, но после ввод имени пользователя/пароля и отправка формы для входа, я снова перенаправляюсь на URL-адрес для входа без сообщения об ошибке.
Я знаю, что это, вероятно, действительно основная проблема, но поскольку на symfony2 еще нет документации, я думаю, что это хорошее место, чтобы задавать такие вопросы, как эта. В общем, есть некоторые моменты внутри проекта symfony2, который, кажется, работает магически (конечно, с поддержкой DI), что усложняет процесс обучения. Мои мысли о том, как работает аутентификация, заключается в том, что есть какой-то волшебный контроллер, который ловит действие validateLogin, ищет репозиторий сущности для моего объекта User, вызывает findOneBy ('username' = > $username) и сравнивает пароли... это не так ли?
Заранее благодарю за какой-либо намек, я уже несколько часов искал эту проблему...:)
Пол