编程

Laravel 中通过密码确认操作来保护敏感操作

154 2024-12-01 00:18:00

在任何 web 应用中,某些特定的操作都需要额外的安全层。Laravel 提供了一种通过密码确认来实现这一点的优雅方法。让我们探讨一下如何在关键操作之前设置密码确认路由来验证用户身份。

密码确认概念

密码确认通过要求用户在执行敏感操作之前重新输入密码来添加额外的安全层。这确保了即使用户离开他们的帐户登录,其他人也无法在不知道密码的情况下执行关键操作。

实现密码确认路由

以下是如何在 Laravel 中实现密码确认路由:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Redirect;

Route::post('/confirm-password', function (Request $request) {
    if (!Hash::check($request->password, $request->user()->password)) {
        return back()->withErrors([
            'password' => ['The provided password does not match our records.']
        ]);
    }

    $request->session()->passwordConfirmed();

    return redirect()->intended();
})->middleware(['auth', 'throttle:6,1']);

这个实现可以拆分如下:

• 路由使用 POST 方法,通常是由表单提交触发的。
• 我们使用 Hash::check() 检查提供的密码是否与经过身份验证的用户的密码匹配。
• 如果密码错误,将重定向到错误消息。
• 如果密码正确,则调用 $request->session()->passwordConfirmed() 将 session 标记为确认。
• 最后,我们将用户重定向到他们的目标位置。
• 路由由 auth 中间件保护,以确保只有经过身份验证的用户才能访问它。
• 我们也应用 throttle:6,1 中间件来防止暴力尝试。

使用密码确认

设置此路由后,你可以使用 password.confirm 中间件保护敏感路由或操作:

Route::post('/sensitive-action', function () {
    // Perform sensitive action
})->middleware(['auth', 'password.confirm']);

用户尝试访问该路由时,如果最佳他们没有确认过密码,将会被重定向到密码确认页面。

真实案例:删除账户

假设有这么一个场景,在允许用户删除帐户之前,我们想确认用户的密码:

Route::delete('/account', function (Request $request) {
    $request->user()->delete();
    Auth::logout();
    return redirect('/')->with('status', 'Your account has been deleted.');
})->middleware(['auth', 'password.confirm']);

本例中:

• 路由被 authpassword.confirm 两个中间件包含。
• 用户必需在访问该路由前确认密码。
• 确认后,账户删除,用户退出登录。

自定义确认窗口

默认情况下,密码确认成功的有效期为三小时。你可以在 config/auth.php 文件中对此进行自定义:

'password_timeout' => 10800,

此值是以秒计,即3 小时等于 10800 秒。
通过实现密码确认,你可以为 Laravel 应用添加一个重要的安全层。此功能对于保护更改密码、更新电子邮件地址或删除帐户等操作特别有用。它确保敏感操作仅由合法的帐户所有者执行。