LoginForm表单的执行过程
2013-11-05 23:02 dreamhappy 阅读(8384) 评论(0) 编辑 收藏 举报读取这篇文章,您将了解到
提前熟悉几个基础点
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的属性。