一直在使用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自动登陆的验证机制浅析的更多相关文章

  1. Linux轻量级自动运维工具-Ansible浅析【转】

    转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...

  2. Linux轻量级自动运维工具-Ansible浅析 转

    转自 Linux轻量级自动运维工具-Ansible浅析 - ~微风~ - 51CTO技术博客http://weiweidefeng.blog.51cto.com/1957995/1895261 Ans ...

  3. InnoDB的锁机制浅析(All in One)

    目录 InnoDB的锁机制浅析 1. 前言 2. 锁基本概念 2.1 共享锁和排它锁 2.2 意向锁-Intention Locks 2.3 锁的兼容性 3. InnoDB中的锁 3.1 准备工作 3 ...

  4. Tornado 的安全性保障机制Cookie XSRF跨站请求伪造阻断 &用户验证机制

    6.1 Cookie 对于RequestHandler,除了在第二章中讲到的之外,还提供了操作cookie的方法. 设置/获取 注意:Cookie 在浏览器调试时, 只有在第一次访问该网站的时候获取到 ...

  5. Linux模块机制浅析

    Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...

  6. shell实现SSH自动登陆

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  7. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  8. yii自动登录

    在yii,登录页面选择记住密码,下次就会自动登陆 前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面 自动登录是利用cookie实现的 配置U ...

  9. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

随机推荐

  1. PHP面向对象(OOP):PHP5接口技术(interface)

    PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类.为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法.接口是一种特殊的抽象 ...

  2. 响应式设计的5个CSS实用技巧

    正如我在教程响应式Web设计三步走当中所讲的,响应式的Web设计其实并不难,但是要让元素在布局切换时能够平滑过渡就比较考验技巧了.现在我分享在编码时常用的五个CSS技巧并举例说明.这些技巧都是使用简单 ...

  3. WCF返回JSON的详细配置

    开发环境:VS2008,c# 1.新建个WCF服务网站 文件-新建-网站-WCF服务 2,运行一下,提示配置WEB.CONFIG,点击确认. 3,打开web.config增加如下节点: <ser ...

  4. SharePoint 2013 更新多个用户字段(Person or Group)

    有时我们需要更新一个用户到Person or Group类型的字段, 当然这个属性允许设置多个用户, 要如何才能添加新的用户到该字段,同时还不影响原始存在的值. 这里我们需要了解 SPFieldUse ...

  5. 转:100个高质量Java开发者博客

    原文来自于:http://www.importnew.com/7469.html ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢 ...

  6. yum仅下载RPM包不安装

    http://www.ttlsa.com/linux/howto-yum-download-rpm-without-install/

  7. 关于javaBean中boolean类型变量的set和get注入后传到前端JS中的问题

    set和get方法如下: public boolean isLine() {        return isLine;    } public void setLine(boolean isLine ...

  8. 利用Java反射机制完成XML到对象的解析

    对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hasht ...

  9. Linux下高并发网络编程

      Linux下高并发网络编程 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户单一进程同时可打 ...

  10. Finding Nemo(bfs)

    Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 6988   Accepted: 1600 Description Nemo ...