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 太陌生了,不知道为什么它对我来说不能像上面那样工作。我最初的猜测是版本差异(两年前提出的问题)。我可以security.provider.default在调用注册模块之前分配给,但我似乎无法分配给security.encoder_factory. 我似乎也必须加入security.firewalls注册电话。

于 2015-10-06T21:42:33.493 回答