fastadmin登陆成功后的处理:
//事件监听
Hook::add('user_login_successed', function ($user) use ($auth) {
$expire = input('post.keeplogin') ? 630 * 86400 : 0;
Cookie::set('uid', $user->id, $expire);
$token=$auth->getToken();
Cookie::set('token', $token, $expire);
});
会将uid和token保存在cookie中
与此同时,对应的token和user_id根据config配置保存
config:
登陆状态保持:
当调用需要登陆才能访问的方法时会调用Auth.php中的init方法,判断用户是否登陆
/**
* 根据Token初始化
*
* @param string $token Token
* @return boolean
*/
public function init($token)
{
if ($this->_logined) {
return true;
}
if ($this->_error) {
return false;
}
$data = Token::get($token);
if (!$data) {
return false;
}
$user_id = intval($data['user_id']);
if ($user_id > 0) {
$user = User::get($user_id);
if (!$user) {
$this->setError('Account not exist');
return false;
}
if ($user['status'] != 1) {
$this->setError('Account is locked');
return false;
}
$this->_user = $user;
$this->_logined = true;
$this->_token = $token;
//初始化成功的事件
Hook::listen("user_init_successed", $this->_user);
return true;
} else {
$this->setError('You are not logged in');
return false;
}
}
请求的cookie中会携带sessionId、token等信息,传入token执行$data = Token::get($token);
传入的token通过连接数据库取得对应的handler
handler存有对应user_id、token、过期时间等数据
然后通过获取到的user_id判断user模型里是否有相应记录,有则登陆成功,反之则需要登陆。
cookie保存的是uid和token,PHPSESSID。登陆主要用到的是cookie中的token,token如果伪造是无法进行登陆的。PHPSESSID主要用在表单提交token验证。
因为cookie保存了uid和token如果用户禁用了cookie,那么就会无法请求需要登陆状态的方法,甚至无法登陆,也无法提交表单。