
Laravel 8: Validación de contraseñas con Rule Object
En el release de hoy, Laravel incluyó una nueva clase que facilitará y mejorará la validación de passwords en nuestras aplicaciones. Nuno Maduro (parte del equipo de Laravel) lo había anunciado hace unos días y finalmente lo tenemos.
Coming to @laravelphp: Password Rule Object. 🔒
— Nuno Maduro (@enunomaduro) April 23, 2021
This rule object allows to easily customise the password complexity requirements. You may also ensure the password has not been compromised in data leaks by using the uncompromised() method. 🔥
🔗 https://t.co/eedKLQuZwp. pic.twitter.com/OBEyliQ7gw
Veamos cómo funciona.
Hasta ahora, para validar contraseñas podemos hacer uso de una combinación de reglas de validación. Por ejemplo, si necesitamos que nuestra contraseña tenga una longitud de 12+ caracteres y caracteres especiales podemos hacer:
$request->validate([
'password' => 'required|string|min:12|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$/',
]);
Podrás notar que utilicé la regla
regex
. La expresión regular mostrada incluye valores alfa-numérico como también símbolos.
A partir de Laravel 5.5+ con la introducción de Rule Objects, podíamos llevar esto a:
$request->validate([
'password' => [
'required', 'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$/',
Password::min(12)],
]);
Ahora, esta clase incluye por defecto método útiles que nos ahorrarán esta tarea. Lo mejor es que podemos encadenarlos.
Por ejemplo podemos hacer:
$request->validate([
'password' => [
'required',
Password::min(12) // Debe tener por lo menos 12 caracteres
->mixedCase() // Debe tener mayúsculas + minúsculas
->letters() // Debe incluir letras
->numbers() // Debe incluir números
->symbols(), // Debe incluir símbolos
],
]);
La cereza del pastel es la inclusión del método uncompromised()
. Este método validará si la contraseña aparece en alguna base de datos filtrada durante ataques a websites y apps. De momento utiliza las APIs de Have I Been Pwned y NotPwnedVerifier:
$request->validate([
'password' => [
'required',
Password::min(12)
->mixedCase()
->letters()
->numbers()
->symbols(),
->uncompromised() // <--
],
]);
Muy cool 😎👌🏼