browner12 / reauthenticate
在更高安全性的页面上重新验证您的用户
Requires
- php: ^7.2
- illuminate/console: ^6.0|^7.0|^8.0
- illuminate/http: ^6.0|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.0
- squizlabs/php_codesniffer: ^2.3
README
对于包含更敏感操作的页面,有时您希望用户重新进行身份验证。这个简单的包提供了您快速在网站上实现此功能所需的工具。
安装
通过 Composer
$ composer require browner12/reauthenticate
设置
将服务提供者添加到 config/app.php
中的 providers 数组中。
'providers' => [ browner12\reauthenticate\ReauthenticateServiceProvider::class, ];
如果您使用 Laravel 的自动包发现,可以跳过此步骤。
发布
虽然我们提供了合理的默认值,但如果您想自定义此包,只需使用以下命令发布配置文件。
php artisan vendor:publish --provider="browner12\reauthenticate\ReauthenticateServiceProvider"
连接
让我们先向 App\Http\Kernel.php
中添加我们的新中间件。
protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'reauthenticate' => \browner12\reauthenticate\Reauthenticate::class, ];
我们需要为重新验证创建两个路由。一个用于显示输入密码的表单,另一个用于处理输入。
Route::get('reauthenticate', 'ReauthenticateController@reauthenticate')->name('reauthenticate'); Route::post('reauthenticate', 'ReauthenticateController@processReauthenticate')->name('reauthenticate.process');
现在让我们创建相关控制器
php artisan make:controller ReauthenticateController
此包提供了一个用于控制器的特质。此模式为您提供根据需要自定义控制器的能力,同时控制对正常包操作重要部分的控制。
该特质提供了两种方法
checkReauthenticationPassword()
- 将输入的密码与已知的散列进行比较,如果成功则返回请求的 URL。失败时返回false
。resetReauthenticationTimer()
- 将当前时间存储在会话中作为上次成功的身份验证。
现在我们将在此控制器中使用此特质。
namespace App\Http\Controllers; use browner12\reauthenticate\Concerns\Reauthenticates; use Illuminate\Http\Request; class ReauthenticateController extends Controller { use Reauthenticates; /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function reauthenticate() { //load view return view('main/auth/reauthenticate'); } /** * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse */ public function processReauthenticate(Request $request) { //good password if ($url = $this->checkReauthenticationPassword($request->get('password'), $request->user()->password)){ return redirect()->to($url); } //send back return back(); } }
我们不需要您的视图以任何方式进行格式化,也不需要为输入命名任何特定名称。在上面的示例中,输入名为 'password',我们从已登录用户中提取当前密码散列。
如果您想在其他控制器中重置计时器,例如当用户首次登录时,您也可以在此特质上使用 resetAuthorizationTimer()
方法。
用法
使用重新验证功能非常简单。只需将中间件添加到您的路由
Route::get('users', 'UserController')->middleware('reauthenticate');
或控制器
class UserController extends Controller { /** * constructor */ public function __construct() { //parent parent::__construct(); //middleware $this->middleware('auth'); //reauthenticate $this->middleware('reauthenticate')->only(['index']); } }
限制
当前此功能仅在 GET 请求上工作。原因是我们不能重定向到 POST 路由。我心中已经有了解决方案,它使用一个具有自动提交表单的哑页面,但我正在等待先看看对此的兴趣。
变更日志
请参阅 变更日志 了解最近更改的更多信息。
贡献
安全性
如果您发现任何安全相关的问题,请通过电子邮件 browner12@gmail.com 而不是使用问题跟踪器。
致谢
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件。