PasswordStrength
ΠΠ°ΡΠ° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° 2025-02-05
PasswordStrength
ΠΠ°Π»ΠΈΠ΄ΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ Π΄ΠΎΡΡΠΈΠ³ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈ, ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π΅ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°Π±ΠΎΡΠ° Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΏΡΠ°Π²ΠΈΠ» (Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΠ»Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΡΠ½ΡΡ ΠΈ Π·Π°Π³Π»Π°Π²Π½ΡΡ Π±ΡΠΊΠ² ΠΈ Ρ.Π΄.), Π° ΠΏΡΡΡΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ½ΡΡΠΎΠΏΠΈΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
??????????? ? | ???????? ??? ?????? |
????? | PasswordStrength |
????????? | PasswordStrengthValidator |
ΠΠ°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ rawPassword
ΠΊΠ»Π°ΡΡΠ° User
Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ
ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈ, ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ
ΠΎΡΠ΅Π½ΠΊΠ° ΡΠ°Π²Π½Π° 2
.
1 2 3 4 5 6 7 8 9 10
// src/Entity/User.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\PasswordStrength]
protected $rawPassword;
}
ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ
minScore
ΡΠΈΠΏ: integer
ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: PasswordStrength::STRENGTH_MEDIUM
(2
)
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΠΎΠ»Ρ. ΠΠΎΡΡΡΠΏΠ½Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ:
PasswordStrength::STRENGTH_WEAK
=1
PasswordStrength::STRENGTH_MEDIUM
=2
PasswordStrength::STRENGTH_STRONG
=3
PasswordStrength::STRENGTH_VERY_STRONG
=4
PasswordStrength::STRENGTH_VERY_WEAK
Π΄ΠΎΡΡΡΠΏΠ½Π°, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ ΠΈΠ»ΠΈ
ΠΆΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΎΡΠ΅Π½ΡΠΈΠΊΠΎΠΌ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ.
1 2 3 4 5 6 7 8 9 10 11 12
// src/Entity/User.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\PasswordStrength([
'minScore' => PasswordStrength::STRENGTH_VERY_STRONG, // Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π½Π°Π΄ΡΠΆΠ½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ
])]
protected $rawPassword;
}
message
ΡΠΈΠΏ: string
ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: ΠΠ°Π΄ΡΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΠΎΠ»Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π½ΠΈΠ·ΠΊΠ°Ρ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄ΡΠΆΠ½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ.
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅, Π΅ΡΠ»ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π΅ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΎΡΠ΅Π½ΠΊΠΈ.
1 2 3 4 5 6 7 8 9 10 11 12
// src/Entity/User.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\PasswordStrength([
'message' => 'Le mot de passe est trop faible. Veuillez utiliser un mot de passe plus fort.'
])]
protected $rawPassword;
}
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ
7.2
Π€ΡΠ½ΠΊΡΠΈΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π±ΡΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² Symfony 7.2.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΠΎΠ»Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΠΏΠ°ΡΠΎΠ»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π΅Π΅ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ:
1 2 3
use Symfony\Component\Validator\Constraints\PasswordStrengthValidator;
$passwordEstimatedStrength = PasswordStrengthValidator::estimateStrength($password);
- ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ
-
Closure
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ PasswordStrengthValidator (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠΉ ΡΠ΅ΡΠ²ΠΈΡΠ° closures).
Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅:
1 2 3 4 5 6 7 8 9 10 11 12
namespace App\Validator;
class CustomPasswordStrengthEstimator
{
/**
* @return PasswordStrength::STRENGTH_*
*/
public function __invoke(string $password): int
{
// ΠΠ°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΡΠ΅Π½ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠΎΠ»Ρ
}
}
ΠΠ°ΡΠ΅ΠΌ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΡΠ²Ρ PasswordStrengthValidator, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ΅Π½ΡΠΈΠΊΠ°:
1 2 3 4 5 6 7
# config/services.yaml
services:
custom_password_strength_estimator:
class: App\Validator\CustomPasswordStrengthEstimator
Symfony\Component\Validator\Constraints\PasswordStrengthValidator:
arguments: [!closure '@custom_password_strength_estimator']