4

fosUserBundle を使ってサイトを立ち上げる作業をしています。いくつかの単体テストを作成する必要がありますが、それらで使用するために認証を正しく機能させることができないようです。私はいくつかの方法を試しましたが、うまくいきませんでした。

アプローチ 1 - セキュリティ設定でプロバイダーをチェーンして、信頼できる標準ログインを作成します。これを行うと、機能する唯一の認証は in_memory プロバイダーです。つまり、管理者ユーザーでログインできますが、fosUserBundle によって作成されたユーザーはログインできません。

security.yml

安全:
    エンコーダ:
        "FOS\UserBundle\Model\UserInterface": 平文
        "Symfony\Component\Security\Core\User\User": 平文

    プロバイダー:
        chain_provider:
            プロバイダー: [メモリ内、fos_userbundle]
        インメモリ:
            ユーザー:
                管理者: { パスワード: 管理者、役割: ['ROLE_ADMIN'] }
        fos_userbundle:
            id: fos_user.user_manager


    ファイアウォール:
        主要:
            パターン: ^/
            フォームログイン:
                プロバイダー: fos_userbundle
                ログインパス: /
                csrf_provider: form.csrf_provider
                default_target_path: /メディア
            ログアウト:真
            匿名:本当
            http_basic:
                プロバイダー: in_memory

方法 2 - 単体テストのセットアップでユーザーを作成しました。しかし、この方法では、作成したばかりのユーザーでログインすることはできません。ユーザーの確認は必要ありません。

パブリック関数setUp() {

        $kernel = static::createKernel();
        $this->repo = $kernel->boot();
        $this->repo = $kernel->getContainer();

        $userManager = $this->repo->get('fos_user.user_manager');

        $email = "testing".(string) self::newRandomNumber()."@test.com";
        $un = "test".(文字列) self::newRandomNumber();
        $fn = "テスト";
        $ln = "ラスター";
        $pwd = "passwordD1";

        $user = $userManager->createUser();

        $user->setEmail($email);
        $user->setUsername($un);
        $user->setFirstName($fn);
        $user->setLastName($ln);
        $user->setPlainPassword($pwd);
        $user->setBimStaff(True);

        // ユーザーをデータベースに永続化します         
        $userManager->updateUser($user);

        $this->user = $user;

        $this->client = static::createClient();
        $crawler = $this->client->request('GET', '/');

        $form = $crawler->selectButton('Login')->form();

        // いくつかの値を設定
        $un = 'ルーカス'.self::newRandomNumber();
        $form['_username'] = $un;
        $form['_password'] = $pwd;

        // フォームを送信

        $crawler = $this->client->submit($form);
        print_r($this->client->getResponse());

        $this->client->followRedirects();

    }

フォームでのログインと http 基本認証の両方を試しましたが、どちらも機能していないようです。

誰にでもアドバイスはありますか?

ありがとう、コーリー

4

2 に答える 2

4

うーん、セキュリティでプロバイダーをチェーン化すると、プロバイダーの 1 つだけを使用することはできないようです。少なくとも、それで問題は解決しました。

// security.yml 
providers:
    chain_provider:
        providers: [in_memory, fos_userbundle]
    in_memory:
        users:
            admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
    fos_userbundle:
        id: fos_user.user_manager


firewalls:
    main:
        pattern: ^/
        form_login:
            provider: chain_provider
            login_path:  /
            csrf_provider: form.csrf_provider
            default_target_path: /media
        logout:       true
        anonymous:    true
        http_basic:
            provider: chain_provider

なんらかの理由で、両方のプロバイダーを変更するとすぐにchain_provider連携が開始されました。

私の単体テストは次のようになります

public function setUp() {

    $kernel = static::createKernel();
    $this->repo = $kernel->boot();
    $this->repo = $kernel->getContainer();


    $this->client = static::createClient(array(), array(
        'PHP_AUTH_USER' => 'admin',
        'PHP_AUTH_PW'   => 'admin',
    ));
    $this->client->followRedirects();

}

これをコピーする場合は、ユーザーに強力なパスワードを使用することをお勧めします:)

于 2012-05-02T17:50:12.870 に答える