在yii,登录页面选择记住密码,下次就会自动登陆

前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面

自动登录是利用cookie实现的

配置User组件
  首先在配置文件的components中设置user组件

 'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'idParam' => '__check',
'identityCookie'=> ['name'=>'_check','httpOnly' => true], ],

登陆

vendor\yiisoft\yii2\web\User.php的login中

$this->switchIdentity($identity, $duration);

先登录在调用switchIdentity方法,设置认证信息,在退出的时候也需要调用这个方法

  1. 设置session的有效期
  2. 如果cookie的有效期大于0并且允许自动登录,那么就把用户的认证信息保存到cookie中,调用sendIdentityCookie方法
  3. 如果允许自动登录,删除cookie信息。这个是用于退出的时候调用的。退出的时候传递进来的$identity为null

sendIdentityCookie

存储在cookie中的用户信息包含有三个值:

    • $identity->getId()
    • $identity->getAuthKey()
    • $duration

getId()和getAuthKey()是在IdentityInterface接口中的。在设置User组件的时候,这个User Model是必须要实现IdentityInterface接口的。所以,可以在User Model中得到

第三值就是cookie的有效期

自动从cookie登录

用户的认证信息已经存储到cookie中了,下次直接从cookie里面取信息然后设置就可以了

Yii提供了AccessControl来判断用户是否登录,有了这个就不需要在每一个action里面再判断了

public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}

在AccessControl访问控制里面通过IsGuest属性来判断是否是认证用户,然后在getIsGuest方法里面是调用getIdentity来获取用户信息,如果为空就是游客(未登录),否则是认证用户。

是认证用户,调用renewAuthStatus(),重新生成用户认证信息

renewAuthStatus()先通过session来判断用户,因为用户登录后就已经存在于session中了。然后再判断如果是自动登录,那么就通过 loginByCookie()方法用cookie信息来登录。

loginByCookie()先读取cookie值,然后$data = json_decode($value, true);反序列化为数组。

要想实现自动登录,这三个值都必须有值。在User Model中还必须要实现findIdentity、validateAuthKey这两个方法。

退出

logout()

$this->switchIdentity(null);先把当前的认证设置为null

再判断如果是自动登录功能则再删除相关的cookie信息

yii自动登录的更多相关文章

  1. yii2.0自动登录功能的实现方法

    参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...

  2. yii2 登录、退出、自动登录

    自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动登录,那么就会把用户的认证信息保存到cookie中,cookie的有效期为1年或者几个月. 在下 ...

  3. yii2 自动登录解读

    今日遇到一个需要将当前用户,全部登出系统(YII2框架制作)重新登录的需求 仔细回忆一遍,Yii2的登录流程,竟然有些不太明白,于是下午空闲时 重新看了下Yii2的用户登录源码 文件位于YII2项目下 ...

  4. Linux开机自动登录(文本模式)

    • Linux系统启动登录过程 以RedHat/CentOS为例,Linux系统Level3模式下从启动到登录的整个过程大致如下: 1> 加载BIOS信息:包含了CPU/显卡/内存/硬盘/网卡等 ...

  5. expect实现自动登录

    自动登录主机(ssh) 建脚本item2login.sh,包含如下内容 #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [ ...

  6. cookie自动登录的实现

         cookie自动登录是指把用户登录的信息按期限(自定)保存在客户端,当用户请求登录时判断客户端用没有cookie对象,有的话填充值,否则登录界面的输入框为空,不进行填充.      登录界面 ...

  7. windows 2003自动登录的具体步骤

    在win2003系统中,使用最多的可能就是远程操作了,关于远程操作的那些事很多用户还是有些迷茫的.如果win2003系统远程重启后,要重新登录系统十分的麻烦,如何才能实现重启后的自动登录呢?让高手告诉 ...

  8. 如何设置phpMyAdmin自动登录和取消自动登录

    如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件,则直 ...

  9. 利用activeX控件在网页里自动登录WIN2003远程桌面并实时控制

    首先要自己配置并打开受控端的WEB远程桌面服务,这个在“添加/删除windows组件”里有,我只在windows 2003 server里试过,没试过XP.下面我们在客户端安装微软提供的远程桌面客户端 ...

随机推荐

  1. linux安装jdk 不成功,找不到版本问题

    http://www.linuxidc.com/Linux/2015-01/112030.htm 配置文件 export JAVA_HOMEexport JRE_HOMEexport CLASSPAT ...

  2. 利用统计学知识为android应用的启动时间做数据分析

    [声明:如需转载本文,请注明来源] 一.数据说明 启动时间用同一台设备,同一个包进行启动时间的测试,其中三组样本数据(每组100份对比数据)如下: 设备pro-5-1 base_list_1 = [0 ...

  3. 【转】LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter

    转自:http://www.cnblogs.com/yaoshiyou/archive/2009/11/25/1610901.html 插件介绍 辛苦了两人小时写日志不小心浏览器崩溃了,发誓以后一定记 ...

  4. AngularJS中的控制器和作用域

    欢迎大家指导与讨论 : ) 一. 作用域的事件传播 一 . 1 修改的传播   关于作用域最重要的一点是修改会通过事件传播下去,自动更新所以依赖的数据值,即使是通过行为产生的.简而言之,就是即时您只修 ...

  5. Linux 网络编程详解四(流协议与粘包)

    TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...

  6. python install

    Install all dependencies by pip install -r requirements.txt (Run this command from project root)

  7. [MetaHook] Surface hook

    Hook ISurface function. #include <metahook.h> #include <vgui/ISurface.h> using namespace ...

  8. c#邮件发送的实现

    第一步 :引用命名空间 using System.Net; using System.Net.Mail; 第二步:具体代码 //创建邮箱信息 MailMessage myMail = new Mail ...

  9. (译文)MVC通用仓储类

    Generic Repository Pattern MVC Generic Repository Pattern MVC 原文链接:http://www.codeproject.com/Articl ...

  10. SQL复杂查询和视图

    子查询 现实中,很多情况下需要进行下述条件判断 某一元素是否是某一集合成员 某一集合是否包含另一集合 测试集合是否为空 测试集合是否存在另一元组 子查询是出现在WHERE子句中的SELECT语句被称为 ...