LoginForm表单的执行过程

简介: 读取这篇文章,您将了解到 提前熟悉几个基础点 LoginForm表单的执行过程 首先我们看表单模型 声明验证规则 填充模型 触发验证 默认的用户密码加密 用户验证中使用Salt 数据验证 调试Yii 参考 提前熟悉几个基础点 attributeLabels()  返回一个属性名字和属性标签的映射。

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

提前熟悉几个基础点

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/

目录
相关文章
|
5月前
|
小程序 前端开发 JavaScript
小程序提交form表单
微信小程序提交form表单内容
53 0
|
5月前
|
前端开发
a标签以post方式提交
a标签以post方式提交
|
安全 应用服务中间件
Form表单method属性的两种提交方式Get和Post的区别
Form表单method属性的两种提交方式Get和Post的区别
199 0
表单提交错误
当需要将表单提交的时候,附加的信息不应放在提交的跳转地址,而是应该使用隐藏域去附加信息
表单提交错误
|
前端开发 安全 JavaScript
form表单提交的submit和ajax区别
有关同源策略和跨域,可以参考 跨域的那些事儿
433 0
|
Python 安全
Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因。 Your browser is accepting cookies. The view function passes a request to the template's render method.
1691 0