📜  laravel 哈希检查密码,验证密码是否匹配哈希 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:36.628000             🧑  作者: Mango

Laravel 哈希检查密码,验证密码是否匹配哈希 - PHP

在网站开发中,用户密码的安全性是十分重要的,因此需要加密保存。Laravel 默认提供了自己的哈希密码处理方式,可以很方便地将明文密码转化为不可逆的哈希码以增加密码的安全性。

在这篇教程中,我们将学习如何使用 Laravel 的哈希功能来处理用户密码的哈希码,并验证生成的哈希码是否与用户输入的明文密码匹配。

步骤 1: 安装 Laravel

首先,我们需要安装 Laravel 框架。你可以选择使用 composer 命令来安装:

composer create-project --prefer-dist laravel/laravel blog
步骤 2: 创建用户登录功能

我们将在 Laravel 中创建一个基础的用户登录功能,用于测试哈希功能。为了方便起见,我们将使用 Laravel 的 make:auth 命令来快速创建登录、注册页面和控制器。

php artisan make:auth

以上命令将生成一个基本的登录和注册模板,以及一个登录和注册控制器。

我们还需要对用户模型进行更新,使其支持密码哈希。打开 app/User.php 文件并添加以下代码:

use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Auth\Authenticatable as AuthenticableTrait;

class User extends \Eloquent implements Authenticatable
{
    use AuthenticableTrait;

    protected $fillable = [
        'name', 'email', 'password'
    ];

    protected $hidden = [
        'password'
    ];
}

这个更新后的 User 模型包括 Authenticatable trait,并定义 $fillable 属性来确定哪些属性可以被批量赋值,以及 $hidden 属性中加入了密码,因为我们不希望在查询数据库时看到用户的密码。

现在我们可以在我们的应用程序中注册新用户,该用户密码将自动哈希化并以安全方式存储。如果您打开 users 数据库表,您会注意到每个用户的密码字段中都有一个哈希值。

我们还需要在 LoginController 中指定用户以哈希方式登录,该部分将在接下来的步骤中讨论。

步骤 3: 哈希密码并保存到数据库

在我们的应用程序中,当用户创建新帐户并填写密码时,我们需要哈希化该密码并将其存储在数据库中。

为此,我们需要在我们的用户控制器中添加一些代码以将密码哈希存储为哈希值。我们将在 RegisterController 中进行以下更改。

use Illuminate\Support\Facades\Hash;

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

在上面的代码中,我们使用 Hash 类来哈希化用户密码。用户密码将被加密并存储到数据库中。

步骤 4: 验证哈希密码是否与明文密码匹配

我们已经存储了经过哈希处理的密码,现在我们需要检查用户输入的密码是否与哈希化的存储密码是否匹配。

在 Laravel 中,我们可以使用 Hash 类的 check 函数来检查哈希密码是否与明文密码匹配。我们将在 LoginController 中添加以下代码来实现验证:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Hash;

public function login(Request $request)
{
    $request->validate([
        'email' => 'required',
        'password' => 'required',
    ]);

    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        return redirect()->intended('/home');
    } else {
        throw ValidationException::withMessages([
            'email' => 'Your login details are incorrect.'
        ]);
    }
}

public function logout()
{
    Auth::logout();
    return redirect('/login');
}

在上述代码中,我们使用 Hash 类的 check 函数来检查哈希密码是否与明文密码匹配。如果密码匹配,则用户被授权,并将重定向到主页,否则我们将抛出 ValidationException

结论

现在您已经学习了如何使用 Laravel 的哈希功能来处理用户密码的哈希码,并验证生成的哈希码是否与用户输入的明文密码匹配。这是保护您网站安全性的重要步骤,希望这篇教程对您有所帮助。