CI 框架利用hooks 做登录/权限验证

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是否具有访问权限
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值