ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
网页上经常有一些自动登录的checkbox,勾选后,下次进入该网站,无需登录,即可执行一些需要登录才能执行的操作。上班无事,用thinkphp做了下。 参考网址:[thinkphp实现自动登录](https://www.cnblogs.com/kongxs/archive/2013/11/14/3423181.html) [TOC] ## 思路分析 ### 初次登录时: 首先,加密 其次,写入cookie ### 再次登录时: 首先,解密 其次,判断信息是否一致 ## 一、HTML ``` <form action="{:U('login')}" method='post' name='login'> <p> <input type="checkbox" name='auto' checked='1' class='auto' id='auto'/> <label for="auto">下次自动登录</label> </p> </form> ``` ## 二、自定义加密函数 文件位置:Index/Common/common.php ``` /** * 异位或加密字符串 * @param [String] $value [需要加密的字符串] * @param [integer] $type [加密解密(0:加密,1:解密)] * @return [String] [加密或解密后的字符串] */ function encryption ($value, $type=0) { $key = md5(C('ENCTYPTION_KEY')); if (!$type) { return str_replace('=', '', base64_encode($value ^ $key)); } $value = base64_decode($value); return $value ^ $key; } ``` ## 三、配置文件 ``` <?php return array( //用于异位或加密的KEY 'ENCTYPTION_KEY' => 'www.psnav.com', //自动登录保存时间 'AUTO_LOGIN_TIME' => time() + 3600 * 24 * 7, //一个星期 ); ?> ``` ## 四、后台处理 ``` /** * 登录表单处理 */ Public function login () { if (!$this->isPost()) { halt('页面不存在'); } //提取表单内容 $account = $this->_post('account'); $pwd = $this->_post('pwd', 'md5'); $where = array('account' => $account); $user = M('user')->where($where)->find(); if (!$user || $user['password'] != $pwd) { $this->error('用户名或者密码不正确'); } if ($user['lock']) { $this->error('用户被锁定'); } //处理下一次自动登录 if (isset($_POST['auto'])) { $account = $user['account']; $ip = get_client_ip(); $value = $account . '|' . $ip; $value = encryption($value); @setcookie('auto', $value, C('AUTO_LOGIN_TIME'), '/'); } //登录成功写入SESSION并且跳转到首页 session('uid', $user['id']); header('Content-Type:text/html;Charset=UTF-8'); redirect(__APP__, 3, '登录成功,正在为您跳转...'); } ``` ## 五、自动登录处理 ``` /** * 自动运行的方法 */ Public function _initialize () { //处理自动登录 if (isset($_COOKIE['auto']) && !isset($_SESSION['uid'])) { $value = explode('|', encryption($_COOKIE['auto'], 1)); $ip = get_client_ip(); //本次登录IP与上一次登录IP一致时 if ($ip == $value[1]) { $account = $value[0]; $where = array('account' => $account); $user = M('user')->where($where)->field(array('id', 'lock'))->find(); //检索出用户信息并且该用户没有被锁定时,保存登录状态 if ($user && !$user['lock']) { session('uid', $user['id']); } } } //判断用户是否已登录 if (!isset($_SESSION['uid'])) { redirect(U('Login/index')); } } ``` if(isset($_COOKIE['auto']) && !$_SESSION['uid']){}这个判断用来判断用户的cookie中有auto值,并且没有登录时,假如验证成功,则进一步验证ip与上次ip是否一致,验证用户名是否存在于数据库中,如果验证通过,则写入session,由此实现自动登录。其中encryption($_COOKIE['auto'],1) 是一个解密函数,将加密后的用户名和密码解密出来进行验证。