تغییراتی که برای شمارش لاگینهای اشتباه و دادن پیام لازم بود رو به سیستم لاگین اضافه کردم.
اول یک جدول بصورت زیر میسازیم:
CREATE TABLE IF NOT EXISTS `attempts` (
`ip` varchar(20) NOT NULL ,
`when` int(11) NOT NULL ,
`del` int(11) DEFAULT NULL ,
KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
بعد تغییرات را در actionAdminLogin اعمال میکنیم:
public function actionAdminLogin()
{
$model=new LoginForm;
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
if($model->validate() && $model->login()){
$this->redirect(array('default/index'));
}
else{
// اگه از قبل رکوردی برای این آی پی در جدول هست آن را حذف کن
Attempts::model()->deleteAll('ip=:Ip AND `when` <= :When AND del=1',array(':Ip'=> $_SERVER['REMOTE_ADDR'], ':When'=> time()));
// یک مدل جدید برای اشتباه فعلی ایجاد کن و آن را ذخیره کن
$insertAttempt= new Attempts;
$insertAttempt->ip= $_SERVER['REMOTE_ADDR'];
$insertAttempt->when= time()+1800;
$insertAttempt->del= 0;
$insertAttempt->save();
// اگر تعداد اشتباهات به سه شماره رسید
// رکوردهایی که برای این آی پی درج کرده ای را آماده حذف شدن قرار بده
// بعد به صفحه اصلی برو
$countFaild= (int)Attempts::model()->count('ip=:ip', array(':ip' => $_SERVER['REMOTE_ADDR']));
$maxAttempts=3;
if($countFaild>= $maxAttempts){
Attempts::model()->updateAll(array('del'=>1), 'ip=:Ip', array(':Ip'=> $_SERVER['REMOTE_ADDR']));
$this->redirect(array('default/index'));
}
}
}
و در آخر تغییراتی را در actionIndex اعمال میکنیم:
public function actionIndex()
{
// همه فیلدهای زمان را که این آی پی را دارند را انتخاب کن
$selectAttempts= Attempts::model()->findAll(
array(
'select'=>'`when`',
'condition'=>'ip=:Ip',
'params'=>array(
':Ip'=> $_SERVER['REMOTE_ADDR'],
)
)
);
if($selectAttempts){
$when=array();
foreach($selectAttempts as $key => $selectAttempt){
$when[]= $selectAttempt['when'];
}
// بیشترین مقدار زمانهای انتخاب شده را بگیر
$maxTime= max($when);
// اگر هنوز زمان فعلی از زمان دریافت شده از جدول کمتر است پیام خطا را نشان بده
if(time()<=$maxTime){
throw new CHttpException(404,'شما سه بار نام کاربری یا رمز عبور را اشتباه وارد کرده اید و برای نیم ساعت مجاز به دیدن صفحه لاگین نیستید.');
}
}
$this->render('index');
}
دوستان اگه میشه کدها رو بهتر از این نوشت لطفا تغییرات لازم رو اعمال کنید.
متشکرم.