需求:
我們有的時候,希望一個賬戶,僅在一個地方登錄。即,在別的地方登錄該賬戶時,當前用戶會被自動注銷。
思路:
用戶數據表admin
id | name | password | session_id |
---|---|---|---|
1 | root | 63a9f0ea7bb98050796b649e85481845 | 3olcdjkj5jjaq2u9t30mbuna96 |
我們實現該功能只需要在普通用戶驗證的基礎上,加一層session_id的驗證就可以了。我們在用戶登錄的時候,將此時的session_id寫入數據表,session_id在本次session有效期是不會變化的。如果在別的地方,登錄了該賬戶,則新的session_id值會寫入數據表,則在驗證用戶信息的時候,當前用戶的session_id和數據表里面的session_id不一致。
核心代碼:
indexController.class.php
<?php
/** * Created by PhpStorm. * User: koastal * Date: 2016/5/15 * Time: 19:28 */ class indexController extends Controller { function __construct() { parent::__construct(); } /** * 顯示用戶信息頁面 */ function index() { $loginController = new loginController(); $loginController->isLogin(); $this->smarty->assign("name",$_SESSION['name']); $this->smarty->assign("id",$_SESSION['id']); $this->smarty->display("info.html"); } }
loginController.class.php
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/28 * Time: 20:37 */ class loginController extends Controller { private $loginModel; function __construct() { parent::__construct(); $this->loginModel = new loginModel(); } /** * @return bool * 判斷當前登錄用戶是否合法 */ function isLogin(){ $res = $this->loginModel->getUserInfoById($_SESSION['id']); if(empty($res)){ echo "未登錄";exit; }else{ $sql_token = md5($res['name'].$res['password']); if($sql_token != $_SESSION['token']){ echo "用戶驗證失敗";exit; }else{ if(session_id()!=$res['session_id']){ echo "該賬戶已在別處登錄";exit; }else{ return true; } } } } /** * 顯示登錄表單 */ function form(){ $this->smarty->display("login.html"); } /** * 執行登錄操作 */ function action(){ $name = $_POST['name']; $password = md5($_POST['password']); $session_id = session_id(); $res = $this->loginModel->loginCheck($name,$password,$session_id); if($res){ $_SESSION['id'] = $res['id']; $_SESSION['name'] = $name; $_SESSION['token'] = md5($name.$password); header("Location:http://login.com/index.php/index/index"); }else{ header("Location:http://login.com/index.php/login/form"); } } }
loginModel.class.php
<?php /** * Created by PhpStorm. * User: koastal * Date: 2016/5/28 * Time: 19:56 */ class loginModel extends Model { /** * @param $id * @return bool */ function getUserInfoById($id){ $sparam = array('id','name','password','session_id'); $wparam = array("id[=]"=>$id); $data = $this->select("admin",$sparam,$wparam); if(empty($data)){ return false; }else{ return $data[0]; } } /** * @param $name * @param $password * @param $session_id * @return array/bool */ function loginCheck($name,$password,$session_id){ $sparam = array('id','name','password',"session_id"); $wparam = array("name[=]"=>$name); $data = $this->select("admin",$sparam,$wparam); if(empty($data)){ return false; }else{ $info = $data[0]; if($info['password']!=$password){ //驗證失敗 return false; }else{ //驗證成功,更新session $newdata = ["session_id"=>$session_id]; $wparam = ["id[=]"=>$info['id']]; $this->update("admin",$newdata,$wparam); return $info; } } } }
項目代碼下載:
鏈接:http://pan.baidu.com/s/1kVAPJjp 密碼:04iv
部署說明:
- host添加 127.0.0.1 login.com
- 在本地新建數據庫test,新建表admin