- CI 的hooks官方文档地址:
http://codeigniter.org.cn/user_guide/general/hooks.html
1.启用钩子
application/config/config.php 文件中
$config['enable_hooks'] = TRUE;
2.定义钩子
application/config/hooks.php 文件中
$hook['pre_controller'] = array(
'class' => 'checkLogin',
'function' => 'index',
'filename' => 'checkLogin.php',
'filepath' => 'hooks',
//可不传参数
//'params' => array('beer', 'wine', 'snacks')
);
3.编写hooks类,在application/hooks 文件夹中新建文件checkLogin.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
use libraries\AdminDB;
/**
* ①hooks类需继承CI_Hooks。
* ②检查是否登录,后续还可以做权限检查。
* ③此处登录信息token、user存在COOKIE中,也可存于SESSION中。
* ④此处服务端token、user直接存于数据库,一般存Redis速度快。
*/
class checkLogin extends CI_Hooks
{
private $path;
protected function index()
{
$this->path = $_SERVER['REQUEST_URI'];
//不验证的接口,否则用户无法登录、注册。
$except = [
'/login/view',
'/login',
'/register/view',
'/register',
];
if (in_array($this->path, $except))
{
return;
}
$this->check();
}
/**
* 验证token和用户名
*/
protected function check()
{
//若用户未登录跳转去登录界面
if ( empty($_COOKIE['user']) || empty($_COOKIE['token']) )
{
header('Location:/login/view');
exit();
}
$userName = $_COOKIE['user'];
$token = $_COOKIE['token'];
$query = ['username' =>$userName];
//MongoDB 中根据用户名查找
$user = AdminDB::selectCollection('admin_user')->findOne($query);
//若无该用户、用户名不符,token不符,token过期则重新登录。
//$user['token_expire'] 为token过期的时间戳
if ( empty($user) || $userName != $user['username'] || $token != $user['token'] || time() > $user['token_expire'] )
{
header('Location:/login/view');
exit();
}
//以上部分只验证了登录,还可以建立权限表,做权限验证。
//框架开启必须使用路由访问,根据数据表中记录的规则,验证当前用户对本次访问的URL是否具有访问权限
}
}