5

そこで、新しいSilexアプリケーションを作成し、含まれているセキュリティバンドルを使用しようとしています。簡単にするために、基本的なパスワードエンコーディングを使用しました。

Silexのドキュメントhttp://silex.sensiolabs.org/doc/providers/security.htmlに従って、カスタムユーザープロバイダーを作成しました。ただし、このユーザーインターフェイスはデフォルトのパスワードエンコーディングを使用していないようです。

パスワードを正常に取得できます

$password = $app['security.encoder.digest']->encodePassword('foo');

ただし、例を使用すると

// find the encoder for a UserInterface instance
$encoder = $app['security.encoder_factory']->getEncoder($user);

// compute the encoded password for foo
$password = $encoder->encodePassword('foo', $user->getSalt());

私は

RuntimeException:アカウントにエンコーダーが構成されていません

symfony2では、次のようなものを使用します

encoders:
        somename:
            class: Acme\DemoBundle\Entity\User
        Acme\DemoBundle\Entity\User: sha512
        Acme\DemoBundle\Entity\User: plaintext
        Acme\DemoBundle\Entity\User:
            algorithm: sha512
            encode_as_base64: true
            iterations: 5000
        Acme\DemoBundle\Entity\User:
            id: my.custom.encoder.service.id

しかし、ここではそうではないようです。どのタイプのsetEncoderメソッドも見つからないようですので、少し困惑しています。

4

2 に答える 2

5

EncoderFactoryカスタム実装を追加するには、を再構築する必要があります。

<?php

$app = new Silex\Application();
$app['myapp.encoder.base64'] = new Base64PasswordEncoder();
$app['security.encoder_factory'] = $app->share(function ($app) {
    return new EncoderFactory(
        array(
            'Symfony\Component\Security\Core\User\UserInterface' => $app['security.encoder.digest'],
            'MyApp\Model\UserInterface'                          => $app['myapp.encoder.base64'],
        )
    );
});

(ああ、お願いします、パスワードにBase64Encoder()を使用しないでください;))

于 2013-01-09T08:28:05.470 に答える
1

受け入れられた回答を使用して問題を解決できましたが、直接割り当てることはできなかったので、うまくいったことをsecurity.encoder_factory共有しています。

それ以外の:

$app['security.encoder_factory'] = $app->share(function($app) {
    //..see above...//
});

私は使用しなければなりませんでした:

$app->register(new Silex\Provider\SecurityServiceProvider(),array(
    'security.encoder_factory' => $app->share(function($app) {
    //... same as above ...//
    })
));

Silex を初めて使用したため、上記のように機能しなかった理由がわかりません。私の最初の推測は、バージョンの違いでしょう (質問は 2 年以上前に行われました)。モジュールを登録する呼び出しの前に に割り当てることはできsecurity.provider.defaultますが、 に割り当てることができないようですsecurity.encoder_factorysecurity.firewallsまた、登録呼び出しを入れる必要があるようです。

于 2015-10-06T21:42:33.493 に答える