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 ...
随机推荐
- 转:Java程序员最常用的8个Java日志框架
作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- BZOJ 1007 水平可见直线
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: ...
- java打jar包 命令行cmd在当前路径打jar包
不尝试就永远不会知道真相. 今天搞webservice,需要将服务单独拉出来发布.打jar包的时候要打成aar包,所以用到cmd下的打jar包的命令. 当前路径打jar包,一定要先进到这个文件夹,然后 ...
- python PIL except: IOError: decoder jpeg not available
今天在Python运行环境的服务器弄一个有关图像处理的程序时报这样的错: 1 NameError: global name 'Image' is not defined import Image 了下 ...
- Git初体验
http://www.cnblogs.com/yejiurui/archive/2013/07/29/3223153.html
- cf C. Inna and Candy Boxes
题意:给你一个长度为n的只含有1和0的字符串,w个询问,每次询问输入l,r:在[l,r]中在l+k-1.l+2*k-1.......r的位置都必须为1,如果不为1的,变成1,记为一次操作,其它的地方的 ...
- cf C. Arithmetic Progression
http://codeforces.com/contest/382/problem/C 题意:给你n个数,然后让你添加一个数使得n+1个数能形成这样的规律,a[1]-a[0]=a[2]-a[1]=a[ ...
- 大用处--PowerShell Management Library for Hyper-V.
http://pshyperv.codeplex.com/releases 用脚本来收集及集成HYPER-V管理. 越来越似KVM,LIBVIRT啦.
- yii分页
关于分页有一个重要的类CPagination. CPagination represents information relevant to pagination. http://www.yiifra ...