Laravel 昨天发布了 v6.2 版本,其中包含一个新的密码确认功能,允许您要求登录用户在被允许访问路由之前重新输入他们的密码。
此功能的工作原理类似于您在执行敏感操作时 GitHub 的确认屏幕。在 Laravel 中设置它非常容易,所以让我们来尝试一下这个新功能,这样您就可以看到它是如何工作的。
设置
首先,让我们创建一个新的 Laravel 应用程序来使用,以便您可以直观地看到此新功能是如何工作的。
laravel new confirm-appcd confirm-appcomposer require laravel/ui --dev
如果您还记得,make:auth 命令已在 Laravel 6 中删除,并移至 laravel/ui 一级包。让我们为我们的应用程序生成授权代码。
php artisan ui vue --authyarn installyarn dev
接下来,让我们配置一个 SQLite 数据库(您可以随意使用任何您喜欢的驱动程序)。
touch database/database.sqlite
我们已经创建了 Laravel 在使用 sqlite
驱动程序时默认查找的文件,但您需要更新 .env
文件,其中包含正确的连接和数据库路径。
DB_CONNECTION=sqlite# ...# Use the default path of the sqlite driver# DB_DATABASE=laravel
接下来,让我们运行迁移,然后创建一个测试用户。
php artisan migrate
我们可以通过控制台使用 factory()
创建一个测试用户。
php artisan tinker>>> $user = factory(App\User::class)->create([... 'password' => bcrypt('secret'),... 'email' => '[email protected]'... ]);
编写控制器
假设您希望用户在查看管理操作(如添加 SSH 密钥)之前重新验证他们的密码。我们希望用户在配置的时间窗口内重新输入他们的密码(默认值为 3 小时)。
我们将创建一个假的 /settings/ssh/create
路由,在该路由中,我们将要求用户在创建新密钥之前使用新的 password.confirm
中间件。
php artisan make:controller Settings/SSHController
接下来,创建控制器操作 create()
。
namespace App\Http\Controllers\Settings; use App\Http\Controllers\Controller;use Illuminate\Http\Request; class SSHController extends Controller{ public function create() { return view('secret'); }}
我们将模拟 secret
模板,我们将它放在视图路径的根目录 resources/views/secret.blade.php
中。
@extends('layouts.app')@section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <h1>Add a New SSH Key</h1> <p>This page is only shown after password confirmation.</p> </div> </div> </div>@endsection
在撰写本文时,您需要将 auth/passwords/confirm.blade.php
文件复制到您的项目中。您可以在这里获取模板:ui/confirm.stub。复制此文件并将其添加到您项目的以下路径中。
resources/views/auth/passwords/confirm.blade.php
接下来,我们需要在 routes/web.php
文件末尾定义路由,以及为此需要的中间件。
Route::namespace('Settings') ->middleware(['auth']) ->group(function () { Route::get('/settings/ssh/create', 'SSHController@create')->middleware('password.confirm'); });
注意:通常,您可能会将所有需要身份验证的路由与 auth
中间件一起分组。在本演示中,我们将在 Settings
命名空间中创建一个控制器路由。
完成这些操作后,您登录后将被重定向到 /home
。从那里,导航到 /settings/ssh/create
,然后系统会提示您输入密码。
如果您按照本教程进行操作,请输入 secret
,提交表单,然后您将被带到 create
视图。在确认密码后,您可以刷新此页面,而不会收到提示。
使用新的 ddd() 助手,将此添加到您的 SSHController::create()
方法中,以可视化确定下次提示您的 auth.password_confirmed_at
会话值。
public function create(){ ddd(session('auth')); return view('secret');}
此值是上次确认密码的时间戳。默认情况下,中间件不会在 3 小时内重新提示。您可以使用 config('auth.password_timeout')
值(位于 config/auth.php
中,截至 v6.2.0 版本)来控制用户在再次确认密码之前应等待多长时间。
了解更多
首先,感谢 Dries Vints 提供了这个很棒的新功能!查看 拉取请求 #5129 以了解实现细节。使用 Laravel 6.2 创建的任何新的 Laravel 应用程序都包含此新中间件!