Browse Source

登录超过五次,限制一分钟内不可以在登陆

master
wanghongjun 2 weeks ago
parent
commit
08a13e8761
  1. 33
      app/Http/Controllers/Admin/AuthController.php
  2. 4
      resources/lang/en/validation.php
  3. 4
      resources/lang/zh-CN/validation.php
  4. 4
      resources/lang/zh-TW/validation.php

33
app/Http/Controllers/Admin/AuthController.php

@ -13,6 +13,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Tymon\JWTAuth\Facades\JWTAuth; use Tymon\JWTAuth\Facades\JWTAuth;
@ -28,6 +29,22 @@ class AuthController extends Controller
*/ */
protected OperationLogService $logService; protected OperationLogService $logService;
/**
* 最大允许的失败尝试次数
*/
protected function maxAttempts(): int
{
return 5; // 5次失败后锁定
}
/**
* 锁定时间(分钟)
*/
protected function decayMinutes(): int
{
return 60; // 锁定60秒
}
/** /**
* 构造函数 * 构造函数
* @param ApiResponseService $responseService * @param ApiResponseService $responseService
@ -51,7 +68,21 @@ class AuthController extends Controller
public function login(Request $request): JsonResponse public function login(Request $request): JsonResponse
{ {
$credentials = $request->only('username', 'password'); $credentials = $request->only('username', 'password');
$throttleKey = strtolower($request->input('username')) . '|'
. $request->ip();
try { try {
if (RateLimiter::tooManyAttempts(
$throttleKey,
$this->maxAttempts()
)
) {
$seconds = RateLimiter::availableIn($throttleKey);
throw new \Exception(
__validation('auth.count1') . ' ' . ceil(
$seconds / $this->decayMinutes()
) . ' ' . __validation('auth.count2')
);
}
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'username' => 'required', 'username' => 'required',
'password' => 'required' 'password' => 'required'
@ -93,8 +124,10 @@ class AuthController extends Controller
'token' => $token, 'token' => $token,
]); ]);
} catch (ValidationException|CustomException $e) { } catch (ValidationException|CustomException $e) {
RateLimiter::hit($throttleKey, $this->decayMinutes());
throw $e; throw $e;
} catch (\Exception $e) { } catch (\Exception $e) {
RateLimiter::hit($throttleKey, $this->decayMinutes());
$m_prefix = __('admin.login') . __('admin.failed'); $m_prefix = __('admin.login') . __('admin.failed');
return $this->responseService->systemError($m_prefix . ':' . $e->getMessage()); return $this->responseService->systemError($m_prefix . ':' . $e->getMessage());
} }

4
resources/lang/en/validation.php

@ -6,7 +6,9 @@ return [
'p_empty' => 'Password cannot be empty', 'p_empty' => 'Password cannot be empty',
'u_p_error' => 'Account or password error', 'u_p_error' => 'Account or password error',
'u_disabled' => 'Account has been disabled', 'u_disabled' => 'Account has been disabled',
'invalid' => 'Invalid Credentials' 'invalid' => 'Invalid Credentials',
'count1' => 'Too many login attempts; please try again in',
'count2' => 'minutes.'
], ],
'admin_user' => [ 'admin_user' => [
'l_a_empty' => 'Login account cannot be empty', 'l_a_empty' => 'Login account cannot be empty',

4
resources/lang/zh-CN/validation.php

@ -6,7 +6,9 @@ return [
'p_empty' => '密码不能为空', 'p_empty' => '密码不能为空',
'u_p_error' => '账号或密码错误', 'u_p_error' => '账号或密码错误',
'u_disabled' => '账号已被禁用', 'u_disabled' => '账号已被禁用',
'invalid' => '无效的凭据' 'invalid' => '无效的凭据',
'count1' => '登录尝试次数过多,请在',
'count2' => '分钟后重试。'
], ],
'admin_user' => [ 'admin_user' => [
'l_a_empty' => '登录账号不能为空', 'l_a_empty' => '登录账号不能为空',

4
resources/lang/zh-TW/validation.php

@ -6,7 +6,9 @@ return [
'p_empty' => '密碼不能為空', 'p_empty' => '密碼不能為空',
'u_p_error' => '帳號或密碼錯誤', 'u_p_error' => '帳號或密碼錯誤',
'u_disabled' => '帳號已被禁用', 'u_disabled' => '帳號已被禁用',
'invalid' => '無效的憑證' 'invalid' => '無效的憑證',
'count1' => '登入嘗試次數過多,請在',
'count2' => '分鐘後重試。'
], ],
'admin_user' => [ 'admin_user' => [
'l_a_empty' => '登入帳號不能為空', 'l_a_empty' => '登入帳號不能為空',

Loading…
Cancel
Save