thinkphp实例--自动登录

浏览:26332 发布日期:2013/08/10 分类:技术分享
相信很多实现这个自动登入都有很多种方法吧,我来说一个我自己的自动登录的实例。

首先我先说明一下,这个自动登入就好像于各个网站那种,

这样的效果!

首先给大家看看我的页面:


然后提交到验证登录的方法。

这个是简单的东西,就不解释了啊,

然后我们想一想,假如判断一个用户登录了一次之后,需要把哪些数据写入到cookie里面去。

我写入的有用户的id,用户名,和用户登录ip,因为ip要用到后来的判断。



然后,还要思考的一个问题就是,写入cookie文明的写入会不安全,所以就要用到加密了。

先给大家贴代码://判断是否自动登入
function checkAutoLogin($value,$type=0){
    $key = md5(C('AUTO_KEYWORDS'));
    if($type){
    return str_replace('==','',base64_encode($key^$value));
      }
    
    $value = base64_decode($value);
    return $key^$value;
}
我来说一下这个加密的方式是怎么样的,默认是type是0,意思就是默认不穿参第二个参数的话 就是解密,如果传递了就是加密。
然后key值就是自己去配置文件配置的一个参数,最好越复杂越好,
然后就是判断,如果type为真的话,就加密,用base64_encode加密,因为还要解密回来的,

假如不传参的话,就直接解密返回回来。

详细还是不会的话,以后说。

继续下一步:


然后就是把cookie写入进去,写入的格式是,第一个是cookie名称,第二个是值,第三个是时间,第四个路径。这个是php基本知识就不多介绍了啊,然后时间也是被我写到配置文件的。

还要写的是session uid 和username都写入进去,写入uid的原因是,还需要判断用户是否已经登录了,假如没有登录,就不会有这个uid存在。

好了,假如你做到这步了,在浏览器的cookie里面会存在一个cookie,名称为auto的。
如图:

这样就是加密的方式写入到cookie里面去了,


然后就是写公用的控制器,因为后台会需要很多控制器,就必须要用到公用控制器,其他的控制器都要继承这个公用控制器。
CommonAction控制器里面第一个就要写一个判断。
判断$_COOKIE['auto']存在,并且$_SESSION['uid']不存在,因为要判断用户不是一个登录的状态,才进行这个判断

然后就要把cookie里面的值解密回来进行判断了
如图:


还是那个方法,当不传递第二个参数的时候就是解密,然后用explode这个字符号分割函数进行分割。

然后继续判断的思路大致为:当你现在登入的ip和cookie里面保存的ip相等时,去把用户名和id拿进去查找数据库,当查找到数据的时候,表示成功,就把uid和username写入带session里面去,

然后 在这个公用控制器里面再最一个判断,当session的uid不存在或者username不存在就跳转到登入页面,我们上面已经把uid和username写入到session里面去了,所以但我们上面的步骤都执行正确了的话,就不会跳到登入页面去了,这就相当于一个自动登录的效果做好了。

再吧公用控制器完整版代码发出来:<?php

class CommonAction extends Action{
    public function _initialize(){
        header('Content-type:text/html;charset=UTF-8');
        if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){
          $auto =explode('|',checkAutoLogin($_COOKIE['auto']));
          $ip = get_client_ip();
          if($auto[2] == $ip){
              $where =array(
                 'id'=>$auto[0],
                'username' =>$auto[1],          
              );
              
              $user= M('admin')->where($where)->find();
              if($user && !$user['lock']){
                  session('uid',$user['id']);
                  session('username',$user['username']);
                  }
              
            }
        }
        
        if(!isset($_SESSION['uid']) && !isset($_SESSION['username'])){
            redirect(U('Admin/Login/index'));
            }
        }
}

?>
然后就是退出登入了,退出登入就是把session清空,然后就是把cookie时间-1就是相当于把cookie给过期掉。


好了,完结,还是那句话,说的不好的欢迎指出来,我会参照您的进行修改的,如果说的不好,别喷~~谢谢
最佳答案
评论( 相关
后面还有条评论,点击查看>>