所以我的控制器上有这个功能来检查用户是否登录,但当用户没有登录时,它不会重定向到登录页面
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 AppFilters;
use CodeIgniterHTTPRequestInterface;
use CodeIgniterHTTPResponseInterface;
use CodeIgniterFiltersFilterInterface;
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/Config/filters.php类中以使其工作
public $aliases = [
'csrf' => CodeIgniterFiltersCSRF::class,
'toolbar' => CodeIgniterFiltersDebugToolbar::class,
'honeypot' => CodeIgniterFiltersHoneypot::class,
'auth' => AppFiltersAuth::class,
];
- 在Routes.phpu中,您可以使用该过滤器来指定使用的路由。在转到您想要的路由之前运行该过滤器
对于单路
$routes->get('examplefunction', 'ControllerName::examplefunction', ['filter' => 'auth']);
对于路由组
$routes->group('', ['filter' => 'auth'], function ($routes) {
$routes->get('/', 'ControllerName::examplefunction');
$routes->get('examplefunction2', 'ControllerName::examplefunction2');
};
使得过滤器将在组内的所有单个路由运行之前执行。
我希望这能帮助你