Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Silex中将密码编码器连接到用户界面?_Php_Symfony_Silex - Fatal编程技术网

Php 如何在Silex中将密码编码器连接到用户界面?

Php 如何在Silex中将密码编码器连接到用户界面?,php,symfony,silex,Php,Symfony,Silex,因此,我试图创建一个新的Silex应用程序,并使用其中包含的安全包。为了简单起见,我打算使用基本的密码编码 根据Silex文档,我创建了一个自定义用户提供程序。但是,此用户界面似乎没有使用默认密码编码 我可以成功地从中获取密码 $password = $app['security.encoder.digest']->encodePassword('foo'); 但是当我使用这个例子时 // find the encoder for a UserInterface instance $en

因此,我试图创建一个新的Silex应用程序,并使用其中包含的安全包。为了简单起见,我打算使用基本的密码编码

根据Silex文档,我创建了一个自定义用户提供程序。但是,此用户界面似乎没有使用默认密码编码

我可以成功地从中获取密码

$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方法,因此我有点困惑。

您需要重建
编码器工厂来添加自定义实现:

<?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'],
        )
    );
});

我可以使用公认的答案来解决我的问题,但我无法直接将其分配给
security.encoder\u 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\u factory
。我似乎还必须在寄存器调用中设置
安全防火墙。

这很有意义。我认为这是沿着这些思路的某个地方,但是silex文档说所有东西都使用默认值。多谢各位!