Frage Wie befestige ich einen Passwort-Encoder an einer Benutzeroberfläche in Silex?


Also versuche ich eine neue Silex-Anwendung zu erstellen und benutze das mitgelieferte Sicherheitspaket. Der Einfachheit halber würde ich die grundlegende Passwortkodierung wählen.

Nach der Silex-Dokumentation http://silex.sensiolabs.org/doc/providers/security.html Ich habe einen benutzerdefinierten Benutzeranbieter erstellt. Diese Benutzeroberfläche scheint jedoch nicht die Standardkennwortcodierung zu verwenden.

Ich kann erfolgreich ein Passwort erhalten

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

Aber wenn ich das Beispiel benutze

// 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());

Ich bekomme die

RuntimeException: Für das Konto wurde kein Encoder konfiguriert

In symfony2 würde ich etwas wie folgt verwenden

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

Aber das scheint hier nicht der Fall zu sein. Ich kann anscheinend keine Art von setEncoder-Methode finden, also bin ich etwas ratlos.


5
2018-01-08 17:02


Ursprung


Antworten:


Sie müssen das rekonstruieren EncoderFactory um Ihre benutzerdefinierte Implementierung hinzuzufügen:

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

(oh und bitte, benutze keinen Base64Encoder () als Passwort;))


5
2018-01-09 08:28



Ich konnte die akzeptierte Antwort verwenden, um mein Problem zu beheben, aber ich konnte es nicht zuweisen security.encoder_factory direkt, also teile ich nur das, was ich gefunden habe, um zu arbeiten.

Anstatt von:

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

Ich musste verwenden:

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

Ich bin zu neu für Silex, um es zu wissen Warum es funktionierte nicht wie oben für mich. Meine erste Schätzung wäre ein Versionsunterschied (Frage wurde vor zwei Jahren gestellt). Ich kann zuweisen security.provider.default vor dem Anruf, um das Modul zu registrieren, aber ich kann nicht zu zuordnen scheinen security.encoder_factory . Ich muss es auch sagen security.firewalls im Registeranruf.


1
2017-10-06 21:42