• 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/

  • 相关阅读:
    电子商务测试点总结
    pc 端 测试点总结
    web测试点总结
    Monkey脚本API
    Git 命令
    配置samba的流程
    scrapy使用指南
    链接
    顺序表总结
    python数据类型——字符串类型
  • 原文地址:https://www.cnblogs.com/needrunning/p/3388809.html
Copyright © 2020-2023  润新知