3

新しい Symfony2 アプリケーションのユーザー認証に問題があります。

このアプリケーションは API を通じてすべての情報を取得するため、データベースは使用されません。ユーザーがログインページに移動すると、ログインフォームにユーザーとパスワードを入力します。次に、API 呼び出しを使用して彼を認証する必要があります。この API 呼び出しは、ユーザーでない場合は「false」を返し、正しいユーザーの場合はトークン キーとトークン シークレットを返します。このトークン キーとシークレットを使用して、ユーザー セッション中に、アプリケーションのすべてのページをレンダリングするために必要なすべての API 要求を行うことができます。ユーザー セッションが終了し、トークン キーとシークレットが消去されると、ユーザーは再度ログインする必要があります。

それをどのように実装するかは本当にわかりません。私はこのhttp://symfony.com/doc/current/cookbook/security/custom_provider.htmlとそのhttp://symfony.com/doc/current/cookbook/security/custom_authentication_provider.htmlを読みましたが、それでもそうです失った... :(

誰でも私を助けることができますか?

どうもありがとう :)

4

1 に答える 1

4

カスタム認証を作成する場合は、正しいリンクが見つかりました。例として、OAuth 認証HWIOAuthBundleの実装を確認できます。ただし、このタイプの認証ではシステム上にユーザーが作成されることに注意してください。データベースを使用しない場合は、ユーザーがリクエストを送信するたびに API にリクエストを送信する必要があります。

まず、魔法がないことを理解する必要があります。リクエストごとに、symfony は URL が指定されたファイアウォールの 1 つと一致するかどうかをチェックします (secutity.yml を参照)。起動したリスナーは、ファイアウォール ファクトリで確認できます。一致が見つかった場合、アクションは対応するAuthenticationListenerに切り替わります。リスナーは、 AuthenticationProviderに送信されるトークンを作成することにより、クレデンシャルの認証を試みます。

$this->authenticationManager->authenticate(new UsernamePasswordToken($username, $password, $this->providerKey));

AuthenticationProvider で

public function authenticate(TokenInterface $token) {
    ...
}

AuthenticationProvider は、UserProvider を介してユーザーを取得しようとします。成功した場合、トークンはセッションに保存されます。後続のリクエストでは、ContextListener が最初に機能し、セッションをチェックし、トークンを抽出して、同様に AuthenticationProvider に送信します。

大まかに言えば、スキームはそのように見えます。詳細については、Symfony セキュリティ コンポーネントのソース コードを調べてください。

本当に良い出発点はUsernamePasswordFormAuthenticationListenerです。リクエストからログインとパスワードを取得し、最も単純な UsernamePasswordToken を作成します。

protected function attemptAuthentication(Request $request)
{
    ...
}

幸運を!

于 2013-04-27T14:38:26.440 に答える