DEV Community

TRUNG VU
TRUNG VU

Posted on

A new Password Rule object from Laravel 8.39

In previous versions, to define a custom validation rule, you must to implement the Illuminate\Contracts\Validation\Rule interface or use a Closure.

As below code, a custom rule StrongPassword like so.

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class StrongPassword implements Rule
{
    public function passes($attribute, $value)
    {
        return preg_match("/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@()$%^&*=_{}[\]:;\"'|\\<>,.\/~`±§+-]).{12,30}$/", $value);
    }

    public function message()
    {
        return 'The :attribute must be 12–30 characters, and include a number, a symbol, a lower and a upper case letter';
    }
}
Enter fullscreen mode Exit fullscreen mode

And use it in your controller or request validation.

namespace App\Http\Requests;

use App\Rules\StrongPassword;
use Illuminate\Foundation\Http\FormRequest;

class AccountRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'password' => [
                'required',
                'confirmed',
                new StrongPassword(),
            ],
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

From version 8.39, Nuno Maduro created a new Password Rule object in this framework with below methods:

min(): Makes minimum size of the password.
mixedCase(): Makes the password require at least one uppercase and one lowercase letter.
letters(): Makes the password require at least one letter.
numbers(): Makes the password require at least one number.
symbols(): Makes the password require at least one symbol.
uncompromised(): Ensures the password has not been compromised by checking the password against a verification API to see if the password appears in data leaks.

$request->validate([
    'password' =>  ['required', 'confirmed', Password::min(8)->mixedCase()],
    'password' =>  ['required', 'confirmed', Password::min(8)->letters()],
    'password' =>  ['required', 'confirmed', Password::min(8)->numbers()],
    'password' =>  ['required', 'confirmed', Password::min(8)->symbols()],
    'password' =>  ['required', 'confirmed', Password::min(8)->uncompromised()],
]);
Enter fullscreen mode Exit fullscreen mode

Or you can use them all combined like so.

$request->validate([
    'password' => ['required', 'confirmed', Password::min(8)
            ->mixedCase()
            ->letters()
            ->numbers()
            ->symbols()
            ->uncompromised(),
    ],
]);
Enter fullscreen mode Exit fullscreen mode

Thanks Nuno Maduro.

Reference: https://github.com/laravel/framework/pull/36960

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (1)

Collapse
 
ariansakhaei profile image
Arian Sakhaei

hi,
how to set custom message for this?

public function messages() {
        return [
            ''password.min'' => 'a custom message',
            ...
       ];
}
Enter fullscreen mode Exit fullscreen mode

The best way to debug slow web pages cover image

The best way to debug slow web pages

Tools like Page Speed Insights and Google Lighthouse are great for providing advice for front end performance issues. But what these tools can’t do, is evaluate performance across your entire stack of distributed services and applications.

Watch video

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay