LoginForm表单的执行过程
读取这篇文章,您将了解到
提前熟悉几个基础点
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表单的执行过程的更多相关文章
- ajaxSubmit提交文件表单不执行success
先描述一下我遇到的问题,系统里所有的表单都用ajaxSubmit来提交,成功回调success函数,普通表单都是没有问题的,但是有文件上传的表单就不行了,不会回调success,经验证会回调compl ...
- symfony2-创建提交表单生成数据过程
一.”一对多“关系 表shop(一)
- flask实现获取表单并执行shell
1.一个HTML form input和一个button提供给用户输入 2.使用flask的request获取用户输入的文件名 3.判断输入异常 4.执行shell命令touch aa.txt 并返回 ...
- HTML或者JSP页面--执行完某事件后刷新页面,重置表单,清空数据
在提交表单或者执行某个事件之后,如果需要重置表单(即清空表单里的数据) 可以执行下面代码来完成 方式一: self.location.href="userController.do?goAd ...
- 使用jQuery.form插件,实现完美的表单异步提交
传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...
- 使用jQuery,实现完美的表单异步提交
jQuery异步提交表单 <form id="form1" method="post"> <table border="1" ...
- php 提交表单
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2017 文章-5 trackba ...
- 文件的上传(表单上传和ajax文件异步上传)
项目中用户上传总是少不了的,下面就主要的列举一下表单上传和ajax上传!注意: context.Request.Files不适合对大文件进行操作,下面列举的主要对于小文件上传的处理! 资源下载: 一. ...
- 普通文件的上传(表单上传和ajax文件异步上传)
一.表单上传: html客户端部分: <form action="upload.ashx" method="post" enctype="mul ...
随机推荐
- eclipse中配置server中选择tomcat8无法进行下一步处理
在创建server的时候,选择tomcat8后,server name为空,并且无法手动输入,同时无法进行下一步操作. 解决方案如下: 1.退出eclipse. 2.找到eclipse[工作空间][当 ...
- nginx docker 方式启动后日志切分的正确姿势
Linux系统的日志文件的切分主要是由logrotate来完成的,以centos7为例配置通常在/etc/logrotate.d 目录下 添加 nginx 文件 cat nginx /var/log/ ...
- Angular之constructor和ngOnInit差异及适用场景
constructor会在类生成实例时调用,Angular无法控制constructor,constructor中应该只进行依赖注入而不是进行真正的业务操作 ngOnInit属于Angular生命周期 ...
- c#复习提纲
c#零碎整理 注:本文中大部分图片来自老师的PPT,感谢邵老师!文中所有内容为自己按照PPT整理,欢迎指正! 标识符 标识符(类名.变量名.方法名.表空间名等) 大小写敏感 正则表达式 小括号(组合 ...
- .net core 应用Nancy快速实现轻量级webapi
目前大量数据接口均采用API的方式为各类应用提供数据服务.Nancy是.net下实现webapi的一个轻量级的框架,可以快速搭建一个api服务环境,是一种快速建立api服务的不错选择. 本文记录.ne ...
- Cesium开发实践汇总
一.简介.开发环境搭建 二.Viewer控件 三.地图图层介绍 四.地形介绍 五.坐标变换 六.CZML 七.3D模型
- 域名通过infopath访问webservice出现401错误
解决办法: 跟服务器有关,需要再每台服务器进行以下配置 New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name " ...
- Let it crash philosophy part II
Designing fault tolerant systems is extremely difficult. You can try to anticipate and reason about ...
- Syncthing源码解析
Gogland编译Syncthing 源码目录说明 Syncthing启动过程分析 在Gogland中对Syncthing的各个模块进行调试 第三方库
- 用TIdIPWatch获取本地IP
Indy的“indy misc”下有一个“TIdIPWatch”组件,可以正确获得本地IP,即使有多块网卡,也可以正确获得真正本地IP. 一,引入单元文件“IdIPWatch”. 二,实际代码: pr ...