gpt4 book ai didi

php - 如何使用 Laravel 密码保护页面?

转载 作者:行者123 更新时间:2023-12-05 09:11:55 25 4
gpt4 key购买 nike

我正在尝试在 Laravel 中设置一些需要密码才能查看的页面。

页面是一个模型,称为页面。

每个页面都有一个关联的密码,存储在页面数据库表中。

架构

Schema::create('pages', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('client_id');
$table->string('url');
$table->text('content');
$table->string('password');
$table->timestamps();
});

我有一条路线,例如Route::get('/page/{url}', 'PageController@index')->middleware('gate');这将显示“页面”,它只是一个 blade/vue 文件,其中包含注入(inject)模板的特定信息。这些页面允许用户通过 AJAX 上传文件。

目前,我为实际的身份验证部分创建了一些中间件。

中间件

public function handle($request, Closure $next)
{
if(Cookie::get($request->route('url'))){
return $next($request);
}
session(['page' => $request->route('url')]);
return redirect()->route('gate',['page'=> $request->route('url')]);
}

PublicController.php

public function gate_check(Request $request)
{
//this part just ensures the correct page is loaded after being authed
$past = parse_url($request->session()->get('_previous')['url']);

if(array_key_exists('query', $past)){
$page = str_replace('page=', '',parse_url($request->session()->get('_previous')['url'])['query']);

$stored_password = Page::where('url', $page)->first()->password;
$password = $request->password;

if($password === $stored_password){
//if password matches, then redirect to that page
return redirect()->route('page', session('page'));
} else {
//else redirect them back to the login page to try again
return back();
}
} else {
//if there is no page information that use should go to, just send them to google instead
return redirect('https://google.com');
}

}

中间件/auth 方法的想法是将用户重定向到登录页面,如果他们没有被授权。 此登录页面仅包含您需要输入的密码。

一旦他们输入,我就设置了一个 cookie,这样他们就可以绕过必须重新登录的问题。

我现在意识到这是不安全的,或者至少看起来是这样,因为客户端/用户可以操纵 cookie 的到期时间 - 导致他们能够永远保持登录状态。

只是想重申一下,上面描述的方法是有效的,但它是不安全的。我还应该重申,这些“页面”允许用户通过 ajax 上传文件。并且只有当用户在该特定页面上时才允许他们上传,例如通过 CSRF。

我需要一种安全的方式来密码保护页面,可以自定义“ session ”的到期时间。我还需要一种方法来“刷新”或“扩展”事件 session ,而无需使用 AJAX 刷新页面,以便用户可以停留在上传页面上(以防上传需要很长时间)。

具有用户名/电子邮件和密码的标准用户帐户不适用。仅密码。

Wordpress 内置了这个功能 - 为什么用 Laravel 来处理看似微不足道的事情却如此困难?

你会如何处理这个问题?

最佳答案

如果我这样做的话:

Standard user account with username/email & password is not applicable. Password only.

对于非标准用户帐户,您可以自己在输入的每个正确密码上生成一个访客 ID,并将其存储到 session 中。

Schema::create('active_guests', function (Blueprint $table) {
$table->bigIncrements('guest_id'); # on your model specify this as primary key
$table->unsignedBigInteger('page_id'); # authorized for after validating password
$table->integer('expires_at'); # store it as unixtimestamp now()->addHours(5)->timestamp
$table->timestamps();
});

您可以通过这种方式查询验证身份

$page = Page::where('url', $page)->where('password', $password)->first();
if ($page) {
ActiveGuest::updateOrcreate(....);
Session::get('pages_authorized_for', [array_of_pages]);
// push the new page id and store it back to session as array
} else {
// incorrect password or page removed
}

Just wish to re-iterate that the method described above is working, but it is insecure. I also should re-iterate that these 'pages' allow users to upload files via ajax. And only should the user be allowed to upload if they're on that specific page e.g. by CSRF.

I need a secure way to password protect pages, which the expiry time of the 'session' can be customised. I'd also need a way to 'refresh' or 'extend' the active session without a page refresh using AJAX so that the user can stay on the upload page (in case uploads take a long time).

通过您的 ajax,您可以在 active_guests 表上增加到期时间。

要延长上传时间,您可以添加一个last_activity 作为时间戳。

关于php - 如何使用 Laravel 密码保护页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59408704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com