读取这篇文章,您将了解到

提前熟悉几个基础点

LoginForm表单的执行过程

首先我们看表单模型

声明验证规则

填充模型

触发验证

默认的用户密码加密

用户验证中使用Salt

数据验证

调试Yii

参考

提前熟悉几个基础点

attributeLabels() 

返回一个属性名字和属性标签的映射。给字段一个显示在页面上的别名, 比如说, ‘user’ => ‘用户名’, 当我们在页面使用的时候, 它显示的就是 用户名 而不再是 username了。

validatePassword()

Yii内置的验证授权框架,核心是一个事先声明的用户应用部件,用来代表当前用户存储的身份信息。通过Yii::app()->user在任何地方来获取它。如:为了检查用户是否输入了一个有效的密码,我们调用 User 类的 validatePassword 方法。

UserIdentity 类

主要用于 LoginForm 类中,它基于用户名和从登录页中收到的密码来实现用户验证。

UserMenu 类

继承自 zii 库中的 CPortlet 类。它覆盖了 CPortlet 类的 init() 和 renderContent() 方法。前者设置 portlet 的标题为当前用户的名字;后者通过渲染一个名为 userMenu 的视图生成 portlet 的主体内容。

Yii中定义了两种模型:CActiveRecord和CFormModel,LoginForm模型属于CFormModel

LoginForm表单的执行过程 

首先我们看表单模型

class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
}

声明验证规则

验证规则是用于检查用户输入的数据,而不是检查我们在代码中生成的数据(例如时间戳,自动产生的主键)。因此,不要为那些不接受最终用户输入的特性添加验证规则

public function rules()
{
return array(
array('username, password', 'required'), //username 和 password 为必填项
array('rememberMe', 'boolean'), //rememberMe 应该是一个布尔值
array('password', 'authenticate'), //password 应被验证(authenticated)
);

public function authenticate($attribute,$params)

{

$this->_identity=new UserIdentity($this->username,$this->password);

if(!$this->_identity->authenticate())

$this->addError('password','错误的用户名或密码。');

}

填充模型

这里的操作属于控制器动作,响应表单提交。 attributes 属性由 CModel定义,它接受一个名值对数组并将其中的每个值赋给相应的模型特性。

$model->attributes=$_POST['LoginForm'];等同于

$model->username=$_POST['LoginForm']['username'];
$model->password=$_POST['LoginForm']['password'];
$model->rememberMe=$_POST['LoginForm']['rememberMe'];

我们需要保证$_POST['LoginForm'] 传递给我们的是一个数组而不是字符串。最后的语句被称为 massive assignment , 它赋值每个$_POST['LoginForm'] 中的 entry 到相应的 model attribute.而它相当于如下的赋值方式:

foreach($_POST['LoginForm'] as $name=>$value)
{

if($name is a safe attribute)
$model->$name=$value;

}

触发验证

一旦模型被用户提交的数据填充,我们就可以调用 CModel::validate() 触发数据验证进程。此方法返回一个指示验证是否成功的值。对 CActiveRecord  模型来说,验证也可以在我们调用其 CActiveRecord::save() 方法时自动触发。

默认的用户密码加密

//beforeSave()这个方法是yii自带的

public function beforeSave(){
  if(parent::beforeSave()){
   //$this->isNewRecord  是否为新添加用户(新纪录)
   if($this->isNewRecord){
    $this->password=$this->encypt($this->password);
  }

return true;

}else{

return false;
  }
 }

//给密码进行md5加密

public function encypt($pass){
  return md5($pass);
 }

用户验证中使用Salt

对于数据库中用户信息的验证,如果使用MD5加密密码原文,为了防止MD5值泄露以及MD5相同等出现的问题,现在比较流行的做法是使用salt,就是为每个用户的密码再随机加上一点东西然后再做MD5,这样即使是相同的密码也不会以相同的MD5来保存,而且就算用户使用弱口令,黑客把MD5拿去也不能计算出口令明文.

验证规则可以是:MD5(用户密码+Salt)的值与数据库里Password做比较。

数据验证

当插入或更新一行时,我们常常需要检查列的值是否符合相应的规则。 如果列的值是由最终用户提供的,这一点就更加重要。总体来说,我们永远不能相信任何来自客户端的数据。

当调用 save() 时, AR(上文说到的CActiveRecord模型) 会自动执行数据验证。 验证是基于在 AR 类的 rules() 方法中指定的规则进行的,方法返回一个规则配置数组。

yii提供了CUserIdentity类,这个类一般用于验证用户名和密码的类.

CComponent

Yii 应用建立于组件之上。组件是 CComponent 或其子类的实例。所有组件类的基类:CComponent,CComponent实现了定义,使用属性和事件的协议,属性是通过getter方法和setter方法定义。

比如User组件中 注销当前用户Yii::app()->user->logout();

user是yii的一个components.需要在protected/config/main.php中定义'user'=>array(
        // enable cookie-based authentication
        'allowAutoLogin'=>true,
        'loginUrl' => array('site/login'),
),

调试Yii

第一步可以查看runtime文件夹下的日志文件

第二步可以在起始文件中 打开Debug  defined('YII_DEBUG') or define('YII_DEBUG',true);

在搭建Yii的过程中,yii的版本和配置main文件不要出错,否则会出现一些莫名其妙的问题。配置main文件实际上是CWebApplication的属性。

参考

魔术变量:

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

http://www.ibm.com/developerworks/cn/opensource/os-cn-yii/

LoginForm表单的执行过程的更多相关文章

  1. ajaxSubmit提交文件表单不执行success

    先描述一下我遇到的问题,系统里所有的表单都用ajaxSubmit来提交,成功回调success函数,普通表单都是没有问题的,但是有文件上传的表单就不行了,不会回调success,经验证会回调compl ...

  2. symfony2-创建提交表单生成数据过程

    一.”一对多“关系 表shop(一)

  3. flask实现获取表单并执行shell

    1.一个HTML form input和一个button提供给用户输入 2.使用flask的request获取用户输入的文件名 3.判断输入异常 4.执行shell命令touch aa.txt 并返回 ...

  4. HTML或者JSP页面--执行完某事件后刷新页面,重置表单,清空数据

    在提交表单或者执行某个事件之后,如果需要重置表单(即清空表单里的数据) 可以执行下面代码来完成 方式一: self.location.href="userController.do?goAd ...

  5. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  6. 使用jQuery,实现完美的表单异步提交

    jQuery异步提交表单 <form id="form1" method="post"> <table border="1" ...

  7. php 提交表单

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园   首页   博问   闪存     联系   订阅  管理 随笔-58  评论-2017  文章-5  trackba ...

  8. 文件的上传(表单上传和ajax文件异步上传)

    项目中用户上传总是少不了的,下面就主要的列举一下表单上传和ajax上传!注意: context.Request.Files不适合对大文件进行操作,下面列举的主要对于小文件上传的处理! 资源下载: 一. ...

  9. 普通文件的上传(表单上传和ajax文件异步上传)

    一.表单上传: html客户端部分: <form action="upload.ashx" method="post" enctype="mul ...

随机推荐

  1. CodeForces 687A NP-Hard Problem (二分图)

    题意:给定 n 条边,然后让你把它分成两组,每组都有所有边的一个端点. 析:一开始我是先判定环,以为就不能成立,其实不是这样的,有环也行.用dfs进行搜索,并标记每一个端点,如果标记过并且和以前不一样 ...

  2. SQLITE3的锁以及事务

    以下内容摘自<SQLITE权威指南>,下载地址http://download.csdn.net/detail/cxjchen/5643391   SQLITE的锁 在SQLite中,锁和事 ...

  3. [转]分布式中使用Redis实现Session共享(二)

    本文转自:http://www.cnblogs.com/yanweidie/p/4678095.html 上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见 ...

  4. 常用脚本--SQL Server获取OS日志

    --=================================================== --SQL Server获取OS日志: ), ), ), ) select @start_d ...

  5. 谁说他们版本不兼容——hadoop1.2.1+hbase0.94.11+nutch2.2.1+el

    一.背景 最近由于项目和论文的需要,需要搭建一个垂直搜索的环境,查阅了很多资料,决定使用Apache的一套解决方案hadoop+hbase+nutch+es.这几样神器的作用就不多作介绍了,自行参考各 ...

  6. 使用RazorGenerator和预编译MVC引擎将Razor视图编译成DLL

    Web开发中常常会有跨页面.跨站点.跨项目组的复用模块(界面),最常见的就是如下方所示的Web页面上用于显示登录或用户名的头部模块, 使用ASP.NET MVC开发中,常见的做法是写成部分视图,本文的 ...

  7. sql performance Kill Lock

    sp_who2 active sp_lock 76 select object_name(261575970,16) select %%lockres%%,* from SessionLock(nol ...

  8. 1416: Kick Ass Biu [几何]

    点击打开链接 1416: Kick Ass Biu [几何] 时间限制: 1 Sec 内存限制: 128 MB 提交: 174 解决: 35 统计 题目描述 在玩Kick Ass的时候,可以发现子弹的 ...

  9. A - 最少拦截系统 (最长上升子序列)

    点击打开链接 A - 最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度. ...

  10. httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法

    原因:httpclient 之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),再次从连接池拿该失效链接进行请求时,就会保存. 解决方法:官方链 ...