2

私はSymfony2検証のオプションを見てきました。問題はこれです:

setPasswordメソッドでパスワードをハッシュするMemberクラスがあります。

public function setPassword($password)
{
    $this->password = Encrypt::cryptPassword($password);
}

ハッシュは、元の入力に関係なく存在する長い文字列です。

このため、このような検証は役に立ちません。

 * @Assert\NotBlank()
 * @Assert\Length(
 *      min = "8",
 *      max = "15",
 *      minMessage = "Your password must be at least {{ limit }} characters",
 *      maxMessage = "Your password cannot be longer than {{ limit }} characters"
 * ) 

入力の有効性に関係なくハッシュ文字列が作成されるため、検証がトリガーされます。

ゲッター検証を試してみましたが、これも行き止まりのようです。繰り返しますが、本当に検証したいのはsetPassword()への元の入力であり、setPasswordがハッシュ値を作成した後にハッシュ値を取得することはできません。役に立った。

元のユーザー入力を検証できる既存の検証コンポーネントで機能する、これに対する推奨されるアプローチは何ですか?

アップデート

私は答えを受け入れましたが、それは実際には実行可能ではありません。それにより、おそらくソリューションの一部となるライフサイクルコールバックシステムに集中することができました。

現在の提案では、パスワードが最初にエンコードされると、ハッシュされたパスワードはもちろん入力ではなく、元の入力に復号化できないため、エンティティを編集しようとするたびに検証を超えます。

私は現在、純粋にパスワードの入力のために、エンティティ内の別の属性を試しています。また、検証グループを使用して、特定の状況(新規ユーザーの作成/パスワードの変更)で検証の使用をトリガーし、他の状況では省略しています。ケース。prePersistコールバックとpreUpdateコールバックを使用して、パスワードのエンコードを行う予定です。

念のために言っておきますが、これは、REST APIを提供するアプリケーション、および選択した機能の管理ツールとWebフロントエンドで採用されています。

4

1 に答える 1

12

教義のライフサイクルを使用し、セッターの動作を変更しないでください!

<?php

// ...

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Member
{
    public function setPassword($password)
    {
        $this->password = $password;
    }

    /**
     * @ORM\PrePersist
     *
     * First time you save the entity
     */
    public function prePersist()
    {
        $this->password = Encrypt::cryptPassword($this->password);
    }
}

この例では、メンバーオブジェクトを保存するまでパスワードはエンコードされないため、assert!によって検証できます。

ただし、Symfony2のセキュリティには、メンバーのパスワードを暗号化して、あなたに代わって仕事をすることができるファイアウォールが付属しています。

http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password

于 2013-01-09T10:04:49.980 に答える