5

Symfony 2.1 に関するこの質問

ユーザーパスワードをエンコードするにはどうすればよいですか:

$factory = $this->get('security.encoder_factory');
$user = new Acme\UserBundle\Entity\User();

$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword('ryanpass', $user->getSalt());
$user->setPassword($password);

そして基本設定:

# app/config/security.yml
security:
    # ...

    encoders:
        Acme\UserBundle\Entity\User: sha512

セッター モデルの内部:

class User implements UserInterface, \Serializable
{
    public function setPassword($password)
    {
       $this->password = $password;
    }
}

暗号化パスワードのプロセスは、モデルごとに処理する必要があると思います。モデル内で標準エンコーダ ファクトリを使用するにはどうすればよいですか?

4

2 に答える 2

11

ビジネスロジックをモデルに漏らしてはならないという@Vadimに同意しますが、イベントまで平文パスワードのハッシュ化を延期することに注意prePersistします。それまでの呼び出しは、重大な結果をもたらす可能性のある別のフィールドに保存していない限り、平文の文字列を返します。理想的には、平文のパスワードは、アプリケーションのライフサイクル内でできるだけ短時間存在する必要があります。persistflushsetPasswordgetPassword

「ユーザーマネージャー」が一般的なタスクへのインターフェイスを提供するサービスレイヤーを使用することをお勧めします。これにより、パスワードプロパティを一時的に汚染する必要がなくなります。

class UserManager
{
    // ...
    public function __construct(EncoderFactoryInterface $encoderFactory)
    {
        // $encoderFactory is injected by the DIC as requested by your service configuration
        // ...
    }

    public function setUserPassword(UserInterface $user, $plaintextPassword)
    {
        $hash = $this->encoderFactory->getEncoder($user)->encodePassword($plaintextPassword, null);
        $user->setPassword($hash);
    }
    // ...
}

たとえば、登録フォームを送信するためのコントローラーで:

public function userRegistrationAction()
{
    // ... 
    if ($form->isValid()) {
        $user = new User();
        // ...
        $this->get('my.bundle.user_manager')->setUserPassword($user, $form->get('password')->getData());
        // ...
    }
}
于 2013-06-23T05:29:33.790 に答える
3

エンティティにはデータが含まれていますが、それを処理することはありません。エンティティのデータを変更したい場合は、イベント リスナーを作成し、永続化の前に何かを行うことができます。公式ドキュメントからイベントリスナーとサブスクライバーを登録する方法を確認してください。

FosUserBundleとそのユーザー管理もご覧ください。

FosUserBundle ユーザーマネージャー

したがって、主なアイデアは、プレーンパスワードをフォームからユーザーエンティティに渡し、イベントリスナーを使用して永続化する前にエンコードすることです。

于 2013-02-14T21:44:13.917 に答える