browner12/reauthenticate

在更高安全性的页面上重新验证您的用户

v1.2.0 2020-09-10 16:17 UTC

This package is auto-updated.

Last update: 2024-09-13 01:12:56 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

对于包含更敏感操作的页面,有时您希望用户重新进行身份验证。这个简单的包提供了您快速在网站上实现此功能所需的工具。

安装

通过 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)。有关更多信息,请参阅 许可文件