所以我正在尝试创建一个新的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方法,所以我有点难过。
答案 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
放入注册调用中。