|
|
@@ -2,6 +2,7 @@
|
|
|
namespace backendApi\modules\v1\models;
|
|
|
|
|
|
use common\components\Model;
|
|
|
+use common\helpers\DingTalk;
|
|
|
use common\libs\LoginIpChecker;
|
|
|
use Yii;
|
|
|
use yii\base\Exception;
|
|
|
@@ -20,6 +21,8 @@ class LoginForm extends Model {
|
|
|
|
|
|
const ERROR_IS_MODIFY_PASSWORD = 'ERROR_IS_MODIFY_PASSWORD';
|
|
|
|
|
|
+ const BACKEND_LOGIN_FAIL_TIMES = 'backend:loginFail:times_%s';
|
|
|
+
|
|
|
/**
|
|
|
* @inheritdoc
|
|
|
*/
|
|
|
@@ -85,6 +88,23 @@ class LoginForm extends Model {
|
|
|
'FAIL_NUMS' => 1,
|
|
|
], 'ADMIN_NAME=:ADMIN_NAME', ['ADMIN_NAME' => $this->adminName]);
|
|
|
$transaction->commit();
|
|
|
+
|
|
|
+ $cacheKey = sprintf(self::BACKEND_LOGIN_FAIL_TIMES, $this->adminName);
|
|
|
+ Yii::$app->tokenRedis->incr($cacheKey);
|
|
|
+
|
|
|
+ // 连续登录失败次数
|
|
|
+ $loginFailTimes = (int)Yii::$app->tokenRedis->get($cacheKey);
|
|
|
+ // 连续登录失败次数上限
|
|
|
+ $loginFailedTopLimit = (int)Yii::$app->params['backendLoginFailedTimesTopLimit'];
|
|
|
+ if ($loginFailTimes >= $loginFailedTopLimit) {
|
|
|
+ // 发送钉钉提醒
|
|
|
+ $content = [
|
|
|
+ 'env' => 'backend',
|
|
|
+ 'message' => sprintf('(NG)提醒:管理员[%s]连续登录失败%d次', $this->adminName, $loginFailTimes),
|
|
|
+ ];
|
|
|
+ DingTalk::sendNotice($content);
|
|
|
+ }
|
|
|
+
|
|
|
if(isset($this->_user)){
|
|
|
AdminLoginLogger::fail($this->_user,$returnResult);
|
|
|
}
|
|
|
@@ -94,6 +114,9 @@ class LoginForm extends Model {
|
|
|
* 更新成功次数
|
|
|
*/
|
|
|
private function _updateSuccessTimes(){
|
|
|
+ $cacheKey = sprintf(self::BACKEND_LOGIN_FAIL_TIMES, $this->adminName);
|
|
|
+ Yii::$app->tokenRedis->del($cacheKey);
|
|
|
+
|
|
|
Admin::updateAllCounters([
|
|
|
'LOGIN_NUMS' => 1,
|
|
|
], 'ADMIN_NAME=:ADMIN_NAME', ['ADMIN_NAME' => $this->adminName]);
|