我正在使用 codeigniter 编写一个 Web 应用程序。
我想在用户访问页面之前验证他们的权限。
实际上除了登录页面之外几乎所有的控制器动作都需要调用模型并使用
$this->Users->validate($username, $password)
我想让每个控制器都通用。我需要继承控制器类吗?我怎样才能做到这一点?
我们有一个使用 Codeigniter 的项目以及我们的做法:
当您拥有新控制器时:
class xxxx extends MY_Controller { }
以及 MY_Controller 类内部
function __construct() {
// do your validations
}
最好的方法是,您应该在您的应用程序/helper文件夹中使用此名称或任何您想要的名称创建一个帮助文件,但不要删除_helper,您应该使用此名称authentication_helper,并将以下代码作为你的
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
function varify_session(){
$CI = &get_instance();
$user_session_id = $CI->session->userdata('logged_in');
if($user_session_id == '') {
redirect('login');
}
}
?>
将代码更改为您的代码。 然后在你的自动加载文件中并将其放入助手中
$autoload['helper'] = array('authentication');
然后你只需要把这一行放入你的每个控制器构造函数中,就像这样
function __construct()
{
parent::__construct();
varify_session();
}
希望它会有所帮助。
请在每个控制器的构造函数中写入以下代码
$this->load->library(‘session’);
$this->load->model(‘login_model’,'login’,TRUE);
/* check whether login or not */
if(!$this->login->check_session()){
redirect(‘/login’);
}
过滤器使用前更正:
class Test extends Controller {
var $before_filter = array();
var $after_filter = array();
function __construct() {
parent::Controller();
$this->before_filter[] = array(
'action' => 'before_filter_run',
);
}
function before_filter_run() {
// Auth here
}
}
详情请阅读这里
在 CodeIgniter 4 中,您应该将逻辑放入 BaseController.php
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger){
// Do Not Edit This Line
parent::initController($request, $response, $logger);
// Preload any models, libraries, etc, here.
// E.g.: $this->session = \Config\Services::session();
}