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

提前熟悉几个基础点

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. eclipse中配置server中选择tomcat8无法进行下一步处理

    在创建server的时候,选择tomcat8后,server name为空,并且无法手动输入,同时无法进行下一步操作. 解决方案如下: 1.退出eclipse. 2.找到eclipse[工作空间][当 ...

  2. nginx docker 方式启动后日志切分的正确姿势

    Linux系统的日志文件的切分主要是由logrotate来完成的,以centos7为例配置通常在/etc/logrotate.d 目录下 添加 nginx 文件 cat nginx /var/log/ ...

  3. Angular之constructor和ngOnInit差异及适用场景

    constructor会在类生成实例时调用,Angular无法控制constructor,constructor中应该只进行依赖注入而不是进行真正的业务操作 ngOnInit属于Angular生命周期 ...

  4. c#复习提纲

    c#零碎整理 注:本文中大部分图片来自老师的PPT,感谢邵老师!文中所有内容为自己按照PPT整理,欢迎指正! 标识符 标识符(类名.变量名.方法名.表空间名等) 大小写敏感 正则表达式  小括号(组合 ...

  5. .net core 应用Nancy快速实现轻量级webapi

    目前大量数据接口均采用API的方式为各类应用提供数据服务.Nancy是.net下实现webapi的一个轻量级的框架,可以快速搭建一个api服务环境,是一种快速建立api服务的不错选择. 本文记录.ne ...

  6. Cesium开发实践汇总

    一.简介.开发环境搭建 二.Viewer控件 三.地图图层介绍 四.地形介绍 五.坐标变换 六.CZML 七.3D模型

  7. 域名通过infopath访问webservice出现401错误

    解决办法: 跟服务器有关,需要再每台服务器进行以下配置 New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name " ...

  8. Let it crash philosophy part II

    Designing fault tolerant systems is extremely difficult.  You can try to anticipate and reason about ...

  9. Syncthing源码解析

    Gogland编译Syncthing 源码目录说明 Syncthing启动过程分析 在Gogland中对Syncthing的各个模块进行调试 第三方库

  10. 用TIdIPWatch获取本地IP

    Indy的“indy misc”下有一个“TIdIPWatch”组件,可以正确获得本地IP,即使有多块网卡,也可以正确获得真正本地IP. 一,引入单元文件“IdIPWatch”. 二,实际代码: pr ...