0

私は Symfon2 に取り組んでおり、ドキュメントを読みましたが、「セキュリティ」セクションに属する問題に遭遇しました。セッションでトークンを保持できるカスタム認証プロバイダーが必要なので、後続のリクエストでトークンを取得できます。ユーザーが正しい資格情報を提供しなかった場合、ログインフォームにリダイレクトされ、提供された場合別のページにリダイレクトされる正しい資格情報。

1. [ようこそページ(保護されたページ)にアクセス]

ユーザー -------------------------------------------------- ------> [ユーザーがログイン フォーム ページにリダイレクトされた] ----> [ユーザーが間違った認証情報を提供した] -----> [ユーザーがログイン フォーム ページに戻った]

2. [ようこそページ(保護されたページ)にアクセス]
ユーザー -------------------------------------- ------> [ユーザーがログイン フォーム ページにリダイレクトされました] ----> [ユーザーが正しい認証情報を提供しました] ------> [ユーザーがアクセスしましたウェルカムページへ】

カスタム認証プロバイダーにいくつかのものを作成してもらい(ldap、db ...などでユーザーを確認してから)、トークンを提供してセキュリティコンテキストに保存し、ログインフォームのリダイレクトが正しく機能することを念頭に置いてください(ユーザー資格情報間違っている場合、ユーザーはログイン フォーム ページにリダイレクトされ、正しい場合はウェルカム ページにリダイレクトされます)。

クックブックには、「カスタム認証プロバイダーを作成する方法」に関する記事があり、「WSSE 認証用のカスタム認証プロバイダーを作成する方法」について話しています。

この記事の後半で、注意事項が書かれています。上記で使用されていないクラスであるAbstractAuthenticationListenerクラスは、セキュリティ拡張に一般的に必要な機能を提供する非常に便利な基本クラスです。これには、セッションでのトークンの維持、成功/失敗ハンドラーの提供、ログイン フォームの URL などが含まれます。WSSE は認証セッションやログイン フォームを維持する必要がないため、この例では使用しません。

クックブックに記載されている例では、ListenerInterfaceが使用されていますが、ログイン フォーム ページでは使用できません。

誰かがこの問題を解決した場合、私は解決策を得ることができてとても感謝しています.

よろしく、
ダニー

4

1 に答える 1

3

db 以外のソースからユーザーを検証する場合は、カスタム認証プロバイダーを作成する必要はないと思います。カスタム ユーザー プロバイダーを作成し、そのプロバイダーをファイアウォールに設定できます。この料理本のエントリを確認してください。

編集

AuthenticationProviderInterfaceカスタム トークンと、トークンとカスタム ユーザー プロバイダーをサポートするカスタムを作成したと仮定して、クラスを実装するクラスを作成し、メソッドAbstractAuthenticationListenerを実装しattemptAuthenticationます。例えば

protected function attemptAuthentication(Request $request)
{
    $param = trim($request->get('parameter', null, true));// auth parameters

    // other processing
    // authenticate method ultimatly calls your custom auth provider that supports your custom token. 
    return $this->authenticationManager->authenticate(new YourCustomToken($username, $password, $this->providerKey));
} 

ここで実装を確認してください。サービス定義はこちら

もう一度編集します。

ユーザー プロバイダーと認証プロバイダーの 2 つがあります。ユーザー プロバイダーは、ユーザー オブジェクトの一意のフィールド (この場合はユーザー名) に基づいて、データ ソースからユーザー オブジェクトを読み込みます。一意のフィールドには、電子メールまたは一意のトークンを指定できます。一方、認証プロバイダーは、指定された資格情報で認証し、認証されると適切なトークンを返します。したがって、最初にソースからユーザーオブジェクトをロードします。あなたの場合はldapです。次に、そのオブジェクトのパスワードを、ユーザー入力から指定されたパスワードでチェックします。混乱が解消されることを願っています。

はい、LDAP プロバイダーにファイアウォールを設定できます。例えば

#app/config/security.yml
firewalls:
    main:
        pattern: ^/
        form_login:
            provider: your_custom_provider
于 2012-05-09T11:44:29.947 に答える