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 ...
随机推荐
- 原生Js获取某个节点后面的第一个标签
nextSlbling属性 获取某个节点后面的第一个节点(可能是标签 文本) 判断获取的节点是否为标签节点还是文本节点 window.onload=function(){ var pagecount= ...
- python中归并排序
# coding=UTF-8 #!/usr/bin/python import sys def merge(nums, first, middle, last): "merge" ...
- day11基础代码——函数指针
// // main.m // Demo11 // // Created by scjy on 15/10/29. // Copyright © 2015年 lizhipeng. All ri ...
- 工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)
原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中 ...
- TF-IDF与余弦相似性的应用
类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块.基于C语言的OTS库.以及基于classifier4J的C#实现和python实现.
- BZOJ 1038 瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- js弹出新窗口居中
方式1: <script language="javascript"> var newUrl = <%=newUrl % > //window.locati ...
- Webpack 傻瓜式指南(一)
modules with dependencies webpack module bundler static assetss .js .js .png Webpack傻瓜式指南 n ...
- HTTP请求和响应详解
HTTP有两部分组成:请求与响应,下面分别整理. 一.HTTP请求 1.HTTP请求格式: <request line> <headers> <blank line> ...
- 【最短路】FOJ 2243 Daxia like uber
题目链接: http://acm.fzu.edu.cn/problem.php?pid=2243 题目大意: 给一张N个点M条边的有向图,从s出发,把在x1的人送到y1,在x2的人送到y2用的最短距离 ...