这里给出的是一个很常用的权限拦截例子,也是目前主流的方法,但存在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也是有风险的:





















