问题描述
因此我可以在控制器上使用此功能来检查用户是否已登录,但是当用户未登录时,它将无法重定向到登录页面
public function __construct()
{
if(session()->get('logged_in') !== true)
{
redirect('login');
}
}
有人对此有解决方案吗?还是应该对每个功能进行会话检查? 喜欢
public function examplefunction()
{
if(session()->get('logged_in') !== true)
{
redirect('login');
}
//run other codes
}
解决方法
在codeigniter 4中,有一个类名过滤器,您可以创建用于认证的类,您可以阅读文档以了解更多详细信息。
这是解决您问题的方法
- 在 App / Filters 文件夹内创建文件 Auth.php
<?php
namespace App\Filters;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
class Auth implements FilterInterface
{
public function before(RequestInterface $request)
{
if(session()->get('logged_in') !== true)
{
return redirect()->to('login');
}
}
//--------------------------------------------------------------------
public function after(RequestInterface $request,ResponseInterface $response)
{
// Do something here
}
}
- 将您的新过滤器添加到过滤器 App / Filters.php 类中,以使其正常工作
public $aliases = [
'csrf' => \CodeIgniter\Filters\CSRF::class,'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,'honeypot' => \CodeIgniter\Filters\Honeypot::class,'auth' => \App\Filters\Auth::class,];
- 在您的 Routes.php 中,您可以使用该过滤器来确定要使用的路由,然后再转到所需的路由。
单条路线
$routes->get('examplefunction','ControllerName::examplefunction',['filter' => 'auth']);
用于路线组
$routes->group('','filter' => 'auth'],function ($routes) {
$routes->get('/','ControllerName::examplefunction');
$routes->get('examplefunction2','ControllerName::examplefunction2');
};
以便该过滤器将在组内所有单个路由运行之前执行。
我希望这对您有帮助