PHP笔记-用户登录&权限拦截说明

x33g5p2x  于2022-03-07 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(243)

这里给出的是一个很常用的权限拦截例子,也是目前主流的方法,但存在cookie劫持,有安全风险。后面有博文说如何去解决。

对应的权限登录的类是这样的:

class PrivilegeController extends Controller {
	......
	......
	......
}

其中权限是在Controller类中,如下:

class Controller{

    protected $smarty;

    public function __construct(){

        include VENDOR_PATH . "smarty/Smarty.class.php";
        $this->smarty = new \Smarty();
        $this->smarty->template_dir = APP_PATH . P . "/view/";
        $this->smarty->compile_dir = RESOURCES_PATH . "views";

        if(strtolower(C) != "privilege"){

            if(isset($_COOKIE['id'])){

                $userModel = new UserModel();
                $user = $userModel->getById((int)$_COOKIE['id']);
                if($user){

                    $_SESSION['user'] = $user;
                    return;
                }
            }

            $this->error("未登录,请先登录", "user", "privilege", "login");
        }
    }

	......
	......
	......
	......
}

从中可以看到这里主要是通过拿到浏览器的COOKIE来判断,拿的这个值通过查询(商用库、Redis等)存不存,存在就放行。并且把$_SESSION['user']存起来。

另外,只有Controller不为privilege的请求,都会被拦截。

设置COOKIE是在登录函数里面,如下:

public function check(){

        $useName = trim($_POST["userName"]);
        $password = trim($_POST["password"]);
        $captcha = trim($_POST["captcha"]);

		......
		......
		......

        @session_start();
        $_SESSION['user'] = $user;
        setcookie('id',$user['user_id'],time() + 1 * 24 * 3600);

        $this->success("登录成功", '', 'dashboard', "index");
    }

退出登录的:

public function logout(){

        session_destroy();
        setcookie('id','',1);
        $this->success("退出成功", "", "", "login");
    }

这里设置的cookie是哪里user_id,对应的是这个

通过修改php.ini可以看其session

内容如下:

但这种,存在cookie劫持,并且这里会把user_id带给cookie也是有风险的:

相关文章

微信公众号

最新文章

更多