Ws経由でログインできるようにしたいのですが。
/login
を指すcurlでこれをシミュレートしようとしましたが、HTMLなどのみを処理します。ちなみに、不要なCSRFが必要です。
そのため、(login_check
から)CRSFを無効にするか、自分でそれを行う方法を見つけたいと思います。
ルートlogin_check
がキャッチされたときに使用されるLoginListener(どこにありますか?)をオーバーライドできますか?.
手がかりは?
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
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);
}