Как спокойно войти в систему, Symfony2 Security, FOSUserBundle, FOSRestBundle?

Я бы хотел войти в систему через ws.

Я попытался имитировать это с помощью curl, указывающего на /login, но он обрабатывает только HTML и т.д. Кстати, для этого требуется CSRF, который мне не нужен.

Поэтому я хотел бы либо отключить CRSF (из login_check), либо найти способ сделать это сам.

Можно ли переопределить LoginListener (где он?), который используется, когда маршрут login_check улавливается.

ЛЮБЫЕ подсказки?

Ответы

Ответ 1

Существует множество способов обеспечения аутентификации и авторизации для веб-службы REST, но наиболее приемлемым является OAuth. Facebook, Twitter, Google, Github и т.д. Используют его.

У людей в Friends Of Symfony есть комплект для реализации аутентификации и авторизации OAuth на Symfony2: https://github.com/FriendsOfSymfony/FOSOAuthServerBundle, и я думаю, что это то, что вы ищут.

EDIT: для получения дополнительной информации об Oauth, люди в Cloudfoundry опубликовали интересную статью пару дней назад.

О других параметрах, которые вы можете использовать, простая базовая аутентификация:

firewalls:
    main:         
        pattern: ^/rest
        anonymous: ~
        form_login: false            
        provider: fos_user_bundle
        http_basic:
            realm: "REST Service Realm"

EDIT2: Как я вижу, все еще есть люди, голосующие за этот ответ, я думаю, что необходимо отметить, что на момент написания этого ответа JWT еще не был вариантом, но, возможно, это лучший вариант, чем OAuth on некоторые случаи использования (например, когда API будет потребляться вашими собственными приложениями). Итак, вот ссылка на хорошую реализацию JWT для Symfony2/3: https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md

Ответ 2

Нельзя использовать CURL для аутентификации пользователя с помощью веб-службы.

Взгляните на ResettingController.php(в FOSUserBundle/Controller) и LoginManager.php(в разделе Безопасность), есть пример того, как аутентифицировать пользователя с помощью Symfony Security:

Контроллер/ResettingController.php

    /**
 * Authenticate a user with Symfony Security
 *
 * @param \FOS\UserBundle\Model\UserInterface        $user
 * @param \Symfony\Component\HttpFoundation\Response $response
 */
protected function authenticateUser(UserInterface $user, Response $response)
{
    try {
        $this->container->get('fos_user.security.login_manager')->loginUser(
            $this->container->getParameter('fos_user.firewall_name'),
            $user,
            $response);
    } catch (AccountStatusException $ex) {
        // We simply do not authenticate users which do not pass the user
        // checker (not enabled, expired, etc.).
    }
}

и в Security/LoginManager.php

    final public function loginUser($firewallName, UserInterface $user, Response $response = null)
{
    $this->userChecker->checkPostAuth($user);

    $token = $this->createToken($firewallName, $user);

    if ($this->container->isScopeActive('request')) {
        $this->sessionStrategy->onAuthentication($this->container->get('request'), $token);

        if (null !== $response) {
            $rememberMeServices = null;
            if ($this->container->has('security.authentication.rememberme.services.persistent.'.$firewallName)) {
                $rememberMeServices = $this->container->get('security.authentication.rememberme.services.persistent.'.$firewallName);
            } elseif ($this->container->has('security.authentication.rememberme.services.simplehash.'.$firewallName)) {
                $rememberMeServices = $this->container->get('security.authentication.rememberme.services.simplehash.'.$firewallName);
            }

            if ($rememberMeServices instanceof RememberMeServicesInterface) {
                $rememberMeServices->loginSuccess($this->container->get('request'), $response, $token);
            }
        }
    }

    $this->securityContext->setToken($token);
}