15

我希望能够通过 ws 登录。

我试图用 curl 指向来模拟这个,/login但它只处理 HTML 等。顺便说一下,它需要一个我不想要的 CSRF。

所以我想要么禁用 CRSF(来自login_check),要么自己找到一种方法。

我可以覆盖捕获路由时使用的 LoginListener(它在哪里?)login_check

任何线索?

4

2 回答 2

22

有许多方法可以向 REST Web 服务提供身份验证和授权,但最被接受的一种似乎是OAuth。Facebook、Twitter、Google、Github 等都使用它。

Friends Of Symfony 的人员有一个捆绑包来在 Symfony2 上实现 OAuth 身份验证和授权: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

于 2012-10-09T13:11:00.173 回答
5

您不应该使用 CURL 来通过您的 Web 服务对用户进行身份验证。

查看 ResettingController.php(在 FOSUserBundle/Controller 中)和 LoginManager.php(在 Security 中),有一个示例如何使用 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);
}
于 2012-10-01T17:03:35.960 回答