Механизм аутентификации на основе доктрины в проекте Symfony2

Я впервые работаю над небольшим проектом, поддерживаемым 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 исключается из области "secureless" после чтение аналогичной ветки на devcomments .

В мою конфигурацию маршрутизации я включаю два правила для аутентификации:

_security_login:
    pattern:                      /login
    defaults:    
        _controller:              PublicBundle:Auth:index

_security_check:
    pattern:                      /validateLogin

Класс сущности, который я использую для представления пользователя, является сущностью Doctrine2 и реализует AccountInterface:

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. В общем, внутри проекта symfony2 есть некоторые моменты, которые кажутся волшебными (конечно, с поддержкой DI), что немного усложняет процесс обучения. Мои мысли о том, как работает аутентификация, заключаются в том, что есть некий волшебный контроллер, который улавливает действие validateLogin, ищет репозиторий сущностей для моей сущности User, вызывает findOneBy ('username' => $ username) и сравнивает пароли ... это правильно?

Заранее благодарю за подсказку, я уже несколько часов гуглил эту проблему ... :)

Пол

14
задан Paul 16 January 2011 в 17:53
поделиться