自动登录

大多数网站为了提高用户体验,会在登录表单的下面提供一个复选框 (保存登录信息以及 下次自动登录)方便用户在不小心的情况下关闭了浏览器或者用户经常使用此网站避免每次都要输入用户名密码,所以大多数采用了自动登录

实现流程(伪代码)

登录表单 ->用户填写数据->提交表单->验证用户名和密码是否正确->密码和用户名正确->保存用户信息到session中->如果用户勾选了复选框->保存数据(令牌随机的字符串)到cookie和数据库->当用户关闭了浏览器或者下次访问的时候->判断session里面有没有数据没有表示没有登录->自动登录拿cookie中的token和数据表里面的token匹配->成功保存用于信息到session中
当前用到最多的就是令牌验证个人信息

实现代码

 

验证登录

 
/**
     * 验证登录
     * 根据用户名获取盐
     * 将密码明文和盐加盐加密
     * 和数据库里面的密码进行比对
     * 比对成功则登录成功
     * 否则登录失败
     */
    public function checkLogin() {
        $username = $this->data['username'];
        $pass = $this->data['password'];
        $admin_info = $this->getByUsername($username);
        if ($admin_info) {
            $password = salt_encty($pass, $admin_info['salt']);
            if ($password == $admin_info['password']) {
                //登录成功后将用户信息保存到session中
                session('ADMIN_INFO', $admin_info);
                //修改用户最后登录时间 和 用户的最后登录ip
                $data = [
                    'last_login_time' => NOW_TIME,
                    'last_login_ip' => get_client_ip(1),
                    'id' => $admin_info['id'],
                ];
                $this->save($data);
                //获取该用户的权限
                $this->_getPermissions();
                //生成tocken 删除tocken
                $this->_setTocken(I('post.remember'),true);
                return true;
            }
        }
        $this->error = '用户名或者密码不匹配';
        return FALSE;
    }

 

 
自动登录
 
​
/**
* 自动登录
* 当用户登录成功后给用户 创建一个tocken 令牌 和令牌的有效期
* 然后将令牌存放在cookie中
* 当用户访问一个url的时候 看用户是否登录 session('ADMIN_INFO')是否有值
* 没有就自动登录用tocken令牌验证
* 当前的tocken和数据表里面的tocken是否匹配 以及tocken是否过期
* 用户自动登陆后是否要重新生成tocken
*/
public function autoLogin() {
//验证是否有tocken
$login_tocken = cookie('LOGIN_TOCKEN');
if (empty($login_tocken)) {
return FALSE;
}
$cond = $login_tocken;
//判断时间是否过期
$cond['tocken_expire'] = ['gt', NOW_TIME - 604800];
//tocken是否匹配
$admin_info = $this->where($cond)->find();
if (empty($admin_info)) {
return FALSE;
}
//成功保存到session
session('ADMIN_INFO', $admin_info);
//保存用户的最后登录时间和ip
$data = [
'last_login_time' => NOW_TIME,
'last_login_ip' => get_client_ip(1),
'id' => $admin_info['id'],
];
$this->save($data);
$this->_setTocken(true);
//获取权限
$this->_getPermissions();
return $admin_info;
}
点击并拖拽以移动
​
 
提升安全性  token只使用一次
 
/**
* 销毁tocken
* 生成tocken
* 有的时候需要生成tocken 有的时候不需要生成所以需要一个标识
* 在勾选了下次登录的时候用到了自动登录用到了cookie 但是用户没有取消那个复选框所以要生成cookie
* @param $reset 是否需要重新设置 令牌的有效期
* @param type $is_create 表示是否生成tocken
*/
private function _setTocken($is_create=false,$reset=FALSE) {
//销毁tocken
$data = [
'id' => session('ADMIN_INFO.id'),
'tocken' => '',
];
$this->save($data); //保存令牌到数据库
//生成tocken
if ($is_create) {
$data = [
'id' => session('ADMIN_INFO.id'),
'tocken' => \Org\Util\String::randString(32),
];
if($reset){
$data[ 'tocken_expire']=NOW_TIME;
}

$this->save($data); //保存令牌到数据库
cookie('LOGIN_TOCKEN', $data, 604800); //保存数据到cookie
}
}
 
 
找行为中验证是否登录
 
public function run(&$params){
        //获取用户当前访问的url
        $url = MODULE_NAME . '/' . CONTROLLER_NAME . '/' . ACTION_NAME;
        //过滤不需要权限访问的url 所有用户都可以访问
        $ingore=C('USER_INGORE');
        if (in_array($url, $ingore)) {
            return true;
        }
        //没有勾选自动登录 登录成功后放到session中的用户信息
        $admin_info = session('ADMIN_INFO');
       //忽略登录用户可以访问的url
        $login_ingore = C('LOGIN_INGORE');
        //如果用户没有登录尝试自动登录
        if (empty($admin_info)) {
            //自动登录
           $admin_info= D('Admin')->autoLogin();