我希望能够通过 ws 登录。
我试图用 curl 指向来模拟这个,/login
但它只处理 HTML 等。顺便说一下,它需要一个我不想要的 CSRF。
所以我想要么禁用 CRSF(来自login_check
),要么自己找到一种方法。
我可以覆盖捕获路由时使用的 LoginListener(它在哪里?)login_check
。
任何线索?
我希望能够通过 ws 登录。
我试图用 curl 指向来模拟这个,/login
但它只处理 HTML 等。顺便说一下,它需要一个我不想要的 CSRF。
所以我想要么禁用 CRSF(来自login_check
),要么自己找到一种方法。
我可以覆盖捕获路由时使用的 LoginListener(它在哪里?)login_check
。
任何线索?
有许多方法可以向 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
您不应该使用 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);
}