diff --git a/config/params.php b/config/params.php index fb3343b..5849a7b 100644 --- a/config/params.php +++ b/config/params.php @@ -7,6 +7,8 @@ $params = [ 'wsURL' => 'ws://192.168.1.111:8081', 'pushAllID' => '38678', 'pushAllKey' => '83a29d6a4bb068458d375daaa16039c4', + 'maxLoginFailCount' => 5, + 'loginFailTimeout' => 600, ]; return ArrayHelper::merge($params, require 'params-local.php'); diff --git a/models/LoginForm.php b/models/LoginForm.php index d849488..82e7226 100644 --- a/models/LoginForm.php +++ b/models/LoginForm.php @@ -53,10 +53,27 @@ class LoginForm extends Model public function validatePassword($attribute, $params) { if (!$this->hasErrors()) { + $session = Yii::$app->session; + + // Set timeout for first time if counter exceed + if ($session->get('failedLoginCount') >= Yii::$app->params['maxLoginFailCount'] and !$session->has('loginAgainAt')) { + $session->set('loginAgainAt', time() + Yii::$app->params['loginFailTimeout']); + $session->set('failedLoginCount', 0); + } + + if ($session->has('loginAgainAt') and $session->get('loginAgainAt') >= time()) { + return $this->addError($attribute, 'Слишком много неудачных попыток. Попробуйте позже'); + } + + if ($session->has('loginAgainAt') and $session->get('loginAgainAt') <= time()) { + $session->remove('loginAgainAt'); + } + $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { $this->addError($attribute, 'Неверный логин или пароль'); + $session->set('failedLoginCount', $session->get('failedLoginCount', 0) + 1); } } } @@ -68,9 +85,12 @@ class LoginForm extends Model public function login() { if ($this->validate()) { + // Reset login failure counter + Yii::$app->session->set('failedLoginCount', 0); + return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); } - + return false; } diff --git a/views/auth/login.php b/views/auth/login.php index 87e4155..c2f6810 100644 --- a/views/auth/login.php +++ b/views/auth/login.php @@ -22,7 +22,6 @@ $fieldOptions2 = [ ?>
-
- -
+ diff --git a/views/layouts/base.php b/views/layouts/base.php index b4d0880..d899f4a 100644 --- a/views/layouts/base.php +++ b/views/layouts/base.php @@ -22,11 +22,21 @@ if (isset($this->params['body-class'])) { + + <?= $this->title ?> - <?= Yii::$app->name ?> + + + + + + + + head() ?>