web-dev-qa-db-ja.com

安らかにログインする方法、Symfony2 Security、FOSUserBundle、FOSRestBundle?

Ws経由でログインできるようにしたいのですが。

/loginを指すcurlでこれをシミュレートしようとしましたが、HTMLなどのみを処理します。ちなみに、不要なCSRFが必要です。

そのため、(login_checkから)CRSFを無効にするか、自分でそれを行う方法を見つけたいと思います。

ルートlogin_checkがキャッチされたときに使用されるLoginListener(どこにありますか?)をオーバーライドできますか?.

手がかりは?

15
Trent

REST Webサービスに認証と承認を提供する方法はたくさんありますが、最も受け入れられているのは OAuth のようです。Facebook、Twitter、Google、Githubなどこれを使って。

Friends Of Symfonyの人々は、OAuth Symfony2での認証と承認: https://github.com/FriendsOfSymfony/FOSOAuthServerBundle を実装するためのバンドルを持っています。これはあなたが探しているもの。

編集:Oauthの詳細については、Cloudfoundryの人々が興味深い投稿をしました 記事 数日前。

使用できる他のオプションについては、簡単なものは基本認証です。

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

EDIT2:まだこの回答に投票している人がいるので、この回答を書いている時点ではJWTはまだオプションではありませんでしたが、OAuth(たとえば、APIが独自のアプリによって消費される場合)。Symfony2/ 3の優れたJWT実装へのリンクは次のとおりです。 https:// github。 com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md

22
adosaiguas

Webサービスでユーザーを認証するためにCURLを使用しないでください。

ResettingController.php(FOSUserBundle/Controller内)とLoginManager.php(セキュリティ内)を見てください。Symfonyセキュリティを使用してユーザーを認証する方法の例があります。

Controller/ResetController.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);
}
5
jeremymarc