2

一部のワードプレスのブログを Symfony に移動して、Symfony2 を学習しています。ログイン手順に行き詰まっています。Wordpress は非標準のパスワード ハッシュを使用し$P$....ており、ログイン時に古いパスワード ハッシュに対してユーザーをチェックし、パスワードが正しい場合は bcrypt に再ハッシュします。これまでのところ、symfony セキュリティ メカニズムで使用するカスタム エンコーダー クラスを作成しました。

<?php
namespace Pkr\BlogUserBundle\Service\Encoder;

use PHPassLib\Application\Context;
use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;
use Symfony\Component\Security\Core\Util\SecureRandom;

class WpTransitionalEncoder implements PasswordEncoderInterface
{

    public function __construct($cost = 13)
    {
        $secure = new SecureRandom();
        $this->_bcryptEncoder = new BCryptPasswordEncoder($secure, $cost);
    }

    public function isPasswordValid($encoded, $raw, $salt)
    {
        if (preg_match('^\$P\$', $encoded)) {
            $context = new Context();
            $context->addConfig('portable');
            return $context->verify($raw, $encoded);
        }
        return $this->_bcryptEncoder->isPasswordValid($encoded, $raw, $salt);
    }

    public function encodePassword($raw, $salt)
    {
        return $this->_bcryptEncoder->encodePassword($raw, $salt);
    }
}

私はそれをサービスとして使用しています:

#/src/Pkr/BlogUserBundle/Resources/config/services.yml
services:
    pkr_blog_user.wp_transitional_encoder:
        class: Pkr\BlogUserBundle\Service\Encoder\WpTransitionalEncoder

そして security.yml では:

#/app/config/security.yml
security:
encoders:
    Pkr\BlogUserBoundle\Entity\User:
        id:   pkr_blog_user.wp_transitional_encoder
        cost: 15

私の質問は次のとおりです。

内のエンコーダ サービス フォームにパラメータを渡すにはどうすればよいsecurity.ymlですか?

cost: 15動かないので質問します。

パスワード ハッシュ更新ロジックはどこに配置すればよいですか? パスワード検証の直後に、次のようになると考えていました。

public function isPasswordValid($encoded, $raw, $salt)
{
    if (preg_match('^\$P\$', $encoded)) {
        $context = new Context();
        $context->addConfig('portable');
        $isValid = $context->verify($raw, $encoded);
        if ($isValid) {
            // put logic here...
        }
        return $isValid;
    }
    return $this->_bcryptEncoder->isPasswordValid($encoded, $raw, $salt);
}

しかし、それはどういうわけか間違った場所のようです。では、正しい方法は何ですか?

4

1 に答える 1

2

私は自分の質問に答えます。

エンコーダー サービスのパラメーターを内部に配置しましたconfig.yml

pkr_blog_user:
    password_encoder:
        cost: 17

それらは私のバンドル拡張クラスに渡されます:

# /src/Pkr/BlogUserBundle/DependencyInjection/PkrBlogUserExtension.php
namespace Pkr\BlogUserBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
* This is the class that loads and manages your bundle configuration
*
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
*/
class PkrBlogUserExtension extends Extension
{
    /**
    * {@inheritDoc}
    */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        if ($config['password_encoder']['cost'] < 10) {
            $config['password_encoder']['cost'] = sprintf('%02d', $config['password_encoder']['cost']);
        }
        $container->setParameter('pkr_blog_user.wp_transitional_encoder.cost', $config['password_encoder']['cost']);

    }
}

独自の認証成功ハンドラーを使用できることがわかったので、パスワードの再ハッシュ ロジックを配置するのに適した場所があります。残念ながら、カスタム ハンドラー symfony2 を使用すると、構成がクラス コンストラクターに渡されませんが、それを機能させる方法を見つけました。ここで説明しました:

https://stackoverflow.com/a/15988399/1089412

于 2013-04-13T13:51:45.463 に答える