如何将密码编码器附加到Silex中的用户界面?

时间:2013-01-08 17:02:17

标签: php symfony silex

所以我正在尝试创建一个新的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方法,所以我有点难过。

2 个答案:

答案 0 :(得分: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()作为密码;))

答案 1 :(得分: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来说太新了,不知道为什么它对我来说并不像以上那样工作。我最初的猜测是版本差异(问题在两年前被问到)。我可以在注册模块之前分配给security.provider.default,但我似乎无法分配给security.encoder_factory。我似乎也必须将security.firewalls放入注册调用中。