yii自动登陆的验证机制浅析
一直在使用yii进行开发, 也知道如何去使用, 也仅仅是知道怎么去用罢了, 终归是没研究过源码, 心里发虚, 今天遇到一个问题, 关于自动登陆的问题.
要求就是, 修改登陆保存session天数为自定义1, 2, 3 ... 等天数, 然后, 把原有的session信息清理掉.
前面一段好操作, 就是在登陆时, 把记住一个月, 修改为多个值, 然后, 传值给 login 方法即可, 后一个把原登陆session信息给清理掉, 这个就不知如何操作了
原来想的是服务器上存储的有session信息, 我把session全删了, 一切搞定, 但事实并非这样, 因为打印出来的session信息, 只有设置过的redis的记录, 其他的没有.
然后就看源码, 以上口水可以忽略, 以下是个人心得:
在 framework/web/auth/CWebUser.php 里有如下代码
>---public function init()
>---{
>--->---parent::init();
>--->---Yii::app()->getSession()->open();
>--->---if($this->getIsGuest() && $this->allowAutoLogin)
>--->--->---$this->restoreFromCookie();
>--->---elseif($this->autoRenewCookie && $this->allowAutoLogin)
>--->--->---$this->renewCookie();
>--->---if($this->autoUpdateFlash)
>--->--->---$this->updateFlash(); >--->---$this->updateAuthStatus();
>---}
>---protected function restoreFromCookie()
>---{
>--->---$app=Yii::app();
>--->---$request=$app->getRequest();
>--->---$cookie=$request->getCookies()->itemAt($this->getStateKeyPrefix());
>--->---if($cookie && !empty($cookie->value) && is_string($cookie->value) && ($data=$app->getSecurityManager()->validateData($cookie->value))!==false)
>--->---{
>--->--->---$data=@unserialize($data);
>--->--->---if(is_array($data) && isset($data[0],$data[1],$data[2],$data[3]))
>--->--->---{
>--->--->--->---list($id,$name,$duration,$states)=$data;
>--->--->--->---if($this->beforeLogin($id,$states,true))
>--->--->--->---{
>--->--->--->--->---$this->changeIdentity($id,$name,$states);
>--->--->--->--->---if($this->autoRenewCookie)
>--->--->--->--->---{
>--->--->--->--->--->---$this->saveToCookie($duration);
>--->--->--->--->---}
>--->--->--->--->---$this->afterLogin(true);
>--->--->--->---}
>--->--->---}
>--->---}
>---}
用vim打开源码有自带的空白转变成了 >-->这样的, 不想管它了, 找着代码在哪就行 - -!
然后, 我把下面的一段摘录出来, 看一下.
$app=Yii::app();
$request=$app->getRequest();
$cookie=$request->getCookies();
$cookie = $cookie['admin'];
echo 'admin的cookie值' . '<br />';
var_dump($cookie);
if($cookie && !empty($cookie->value) && is_string($cookie->value) && ($data=$app->getSecurityManager()->validateData($cookie->value))!==false)
{
echo '验证以后, 未进行序列化前的值' . '<br />';
var_dump($data);
$data=@unserialize($data);
echo '序列化以后的值' . '<br />';
var_dump($data);
if(is_array($data) && isset($data[0],$data[1],$data[2],$data[3]))
{
list($id,$name,$duration,$states)=$data;
echo 'cookie所加时间(秒计)' . '<br />';
var_dump($duration);die;
}
}
输出如下
admin的cookie值
object(CHttpCookie)[548]
public 'name' =>
string
'admin' (length=5)
public 'value' =>
string
'dvdsdsefeveererererefdsafdsvcdsavsaa:4:{i:0;s:1:"1";i:1;s:5:"admin";i:2;i:2592000;i:3;a:2:{s:4:"role";s:3:"100";s:3:"uid";s:1:"1";}}' (length=137)
public 'domain' =>
string
'' (length=0)
public 'expire' =>
int
public 'path' =>
string
'/' (length=1)
public 'secure' =>
boolean
false
public 'httpOnly' =>
boolean
false
private '_e'
(CComponent)
=> null
private '_m'
(CComponent)
=> null
验证以后, 未进行序列化前的值
string
'a:4:{i:0;s:1:"1";i:1;s:5:"admin";i:2;i:2592000;i:3;a:2:{s:4:"role";s:3:"100";s:3:"uid";s:1:"1";}}' (length=97)
序列化以后的值
array (size=4)
0 =>
string
'1' (length=1)
1 =>
string
'admin' (length=5)
2 =>
int
3 =>
array (size=2)
'role' =>
string
'100' (length=3)
'uid' =>
string
'1' (length=1)
cookie所加时间(秒计)
int
它是使用自有方法去验证, 得到的cookie是不是自己生成的( $app->getSecurityManager()->validateData($cookie->value) )
如果是, 把内容反序列化, 取出日期, 自动登陆, 同时, 把有效期重新往后沿续, 不是的话, 不处理, 也就是说, 需要重新登陆
时间仓促, 写的不好, 只是作个简单记录, 下面这篇文章写的是登陆流程, 可作参考, 这篇文章是对yii如何实现自动登陆的一个手写草稿, 待有时间再完善
http://www.cnblogs.com/jmax/archive/2010/07/21/1782396.html yii 登陆流程参考

yii自动登陆的验证机制浅析的更多相关文章
- Linux轻量级自动运维工具-Ansible浅析【转】
转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...
- Linux轻量级自动运维工具-Ansible浅析 转
转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...
- InnoDB的锁机制浅析(All in One)
目录 InnoDB的锁机制浅析 1. 前言 2. 锁基本概念 2.1 共享锁和排它锁 2.2 意向锁-Intention Locks 2.3 锁的兼容性 3. InnoDB中的锁 3.1 准备工作 3 ...
- Tornado 的安全性保障机制Cookie XSRF跨站请求伪造阻断 &用户验证机制
6.1 Cookie 对于RequestHandler,除了在第二章中讲到的之外,还提供了操作cookie的方法. 设置/获取 注意:Cookie 在浏览器调试时, 只有在第一次访问该网站的时候获取到 ...
- Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- shell实现SSH自动登陆
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- 【MVC】ASP.NET MVC Forms验证机制
http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121 文章 - 0 评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...
- yii自动登录
在yii,登录页面选择记住密码,下次就会自动登陆 前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面 自动登录是利用cookie实现的 配置U ...
- 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证
背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...
随机推荐
- JDK和JRE的区别?
很多朋友可能跟我一样,已经使用JAVA开发很久了,可是对JDK,JRE,JVM这三者的联系与区别,一直都是模模糊糊的. 今天特写此文,来整理下三者的关系. JDK : Java Development ...
- Bow模型(解释的很好)
Bag-of-words model (BoW model) 最早出现在NLP和IR领域. 该模型忽略掉文本的语法和语序, 用一组无序的单词(words)来表达一段文字或一个文档. 近年来, BoW模 ...
- 如何完美打造Win8 Metro版IE10浏览器页面(转)
Windows8 内置两种 Internet Explorer 10 (以下简称 IE10),一个是在桌面环境下使用的 IE10:视窗操作.可以支持各种插件(ActiveX):而另外一个则是在新的开始 ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
- BZOJ 1208 宠物收养所
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- MC中间件WCCS
一.问题描述 在大访问量的Web服务中,MC集群作为缓解后端数据源访问压力的中间层已经成为了不可缺少的一部分,机器数量越来越大,维护成本也变得越来越高了,其中的问题有: 故障机器自动剔除.后端某台MC ...
- Unity3d 基础知识学习 工具篇
Unity3d 层(layer)的学习 @广州小龙 unity中的层是个很有用的东西, 点击层的下拉框,点击Add Layer,可以打开层管理器,我新建了一个层为test 他的id值是8,这个后面会 ...
- Unity3d开发IOS游戏 基础
Unity3d开发IOS游戏 基础 @阿龙 - 649998群 1.先说明两个问题,我在WIN7下面的U3D里面,用了雅黑字体,但是导出为ios后,字体就看不见了,这是为什么呢?这是需要在MAC下找 ...
- 要开始深入VMM了。
得到一个VMM机器所有的节点状态 Quick one-liner to generate a CSV of virtual machines, sorted by their hosts. Repor ...
- Keil MDK入门---从新建一个工程开始
熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...