Правило NotCompromisedPassword
Правило NotCompromisedPassword является ограничением валидации
и вешается на поле формы или свойство сущности.
Оно проверяет, не встречался ли введённый пароль в базах утечек.
Проверка выполняется через сервис Have I Been Pwned.
Правило не гарантирует абсолютную безопасность,
но отсеивает уже скомпрометированные пароли.
Синтаксис
#[NotCompromisedPassword(
message: 'The password has been compromised.',
threshold: 1,
skipOnError: false
)]
Пример
Давайте создадим сущность User с полем password
и повесим на него правило NotCompromisedPassword:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
#[ORMEntity]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
#[AssertNotCompromisedPassword]
private string $password;
public function getId(): int
{
return $this->id;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
}
?>
Пример
Давайте проверим пароль через валидатор вручную:
<?php
namespace AppController;
use AppEntityUser;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidatorValidatorInterface;
class UserController extends AbstractController
{
public function check(ValidatorInterface $validator): Response
{
$user = new User();
$user->setPassword('abcde');
$errors = $validator->validate($user);
if (count($errors) > 0) {
return new Response((string) $errors);
}
return new Response('valid');
}
}
?>
Результат выполнения кода для пароля 'abcde':
"valid"
Пример
Давайте используем правило внутри формы:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypePasswordType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentValidatorConstraintsNotCompromisedPassword;
use SymfonyComponentOptionsResolverOptionsResolver;
class UserType extends AbstractType
{
public function buildForm(
FormBuilderInterface $builder,
array $options
): void {
$builder->add('password', PasswordType::class, [
'constraints' => [
new NotCompromisedPassword(),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
?>
Смотрите также
-
правило
PasswordStrength,
которое проверяет надёжность пароля -
правило
NotBlank,
которое проверяет, что поле не пустое -
правило
Length,
которое проверяет длину строки -
правило
Regex,
которое проверяет строку на соответствие регулярному выражению