Skip to content

Commit 7220dff

Browse files
committed
perf:增加自定义登录异常类,统一监测返回所有异常登录信息
1 parent 54bd6ac commit 7220dff

File tree

5 files changed

+53
-40
lines changed

5 files changed

+53
-40
lines changed

dash-fastapi-backend/app.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from config.get_redis import RedisUtil
2323
from config.get_db import init_create_table
2424
from config.get_scheduler import SchedulerUtil
25-
from utils.response_util import response_401, AuthException
25+
from utils.response_util import *
2626
from utils.log_util import logger
2727
from utils.common_util import worship
2828

@@ -71,6 +71,12 @@ async def auth_exception_handler(request: Request, exc: AuthException):
7171
return response_401(data=exc.data, message=exc.message)
7272

7373

74+
# 自定义登录检验异常
75+
@app.exception_handler(LoginException)
76+
async def login_exception_handler(request: Request, exc: LoginException):
77+
return response_400(data=exc.data, message=exc.message)
78+
79+
7480
@app.exception_handler(HTTPException)
7581
async def http_exception_handler(request: Request, exc: HTTPException):
7682
return JSONResponse(

dash-fastapi-backend/module_admin/controller/log_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ async def clear_system_login_log(request: Request, clear_login_log: ClearLoginLo
134134
return response_500(data="", message=str(e))
135135

136136

137-
@logController.post("/login/unlock", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))])
137+
@logController.post("/login/unlock", response_model=CrudLogResponse, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:unlock'))])
138138
@log_decorator(title='登录日志管理', business_type=9)
139139
async def clear_system_login_log(request: Request, unlock_user: UnlockUser, query_db: Session = Depends(get_db)):
140140
try:

dash-fastapi-backend/module_admin/controller/login_controller.py

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,29 @@
1717
@loginController.post("/loginByAccount", response_model=Token)
1818
@log_decorator(title='用户登录', business_type=0, log_type='login')
1919
async def login(request: Request, user: UserLogin, query_db: Session = Depends(get_db)):
20+
result = await authenticate_user(request, query_db, user)
2021
try:
21-
result = await authenticate_user(request, query_db, user)
22-
if result in ['用户不存在', '密码错误', '用户已停用', '验证码已失效', '验证码错误', '账号已锁定,请稍后再试', '10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试']:
23-
logger.warning(result)
24-
return response_400(data="", message=result)
25-
26-
else:
27-
access_token_expires = timedelta(minutes=JwtConfig.ACCESS_TOKEN_EXPIRE_MINUTES)
28-
try:
29-
session_id = str(uuid.uuid4())
30-
access_token = create_access_token(
31-
data={
32-
"user_id": str(result[0].user_id),
33-
"user_name": result[0].user_name,
34-
"dept_name": result[1].dept_name,
35-
"session_id": session_id,
36-
"login_info": user.login_info
37-
},
38-
expires_delta=access_token_expires
39-
)
40-
await request.app.state.redis.set(f'access_token:{session_id}', access_token, ex=timedelta(minutes=30))
41-
# 此方法可实现同一账号同一时间只能登录一次
42-
# await request.app.state.redis.set(f'{result.user_id}_access_token', access_token, ex=timedelta(minutes=30))
43-
# await request.app.state.redis.set(f'{result.user_id}_session_id', session_id, ex=timedelta(minutes=30))
44-
logger.info('登录成功')
45-
return response_200(
46-
data={'token': access_token},
47-
message='登录成功'
48-
)
49-
except Exception as e:
50-
logger.exception(e)
51-
return response_500(data="", message="生成token失败")
22+
access_token_expires = timedelta(minutes=JwtConfig.ACCESS_TOKEN_EXPIRE_MINUTES)
23+
session_id = str(uuid.uuid4())
24+
access_token = create_access_token(
25+
data={
26+
"user_id": str(result[0].user_id),
27+
"user_name": result[0].user_name,
28+
"dept_name": result[1].dept_name,
29+
"session_id": session_id,
30+
"login_info": user.login_info
31+
},
32+
expires_delta=access_token_expires
33+
)
34+
await request.app.state.redis.set(f'access_token:{session_id}', access_token, ex=timedelta(minutes=30))
35+
# 此方法可实现同一账号同一时间只能登录一次
36+
# await request.app.state.redis.set(f'{result.user_id}_access_token', access_token, ex=timedelta(minutes=30))
37+
# await request.app.state.redis.set(f'{result.user_id}_session_id', session_id, ex=timedelta(minutes=30))
38+
logger.info('登录成功')
39+
return response_200(
40+
data={'token': access_token},
41+
message='登录成功'
42+
)
5243
except Exception as e:
5344
logger.exception(e)
5445
return response_500(data="", message=str(e))

dash-fastapi-backend/module_admin/service/login_service.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,19 @@ async def authenticate_user(request: Request, query_db: Session, login_user: Use
109109
"""
110110
account_lock = await request.app.state.redis.get(f"account_lock:{login_user.user_name}")
111111
if login_user.user_name == account_lock:
112-
return '账号已锁定,请稍后再试'
112+
logger.warning("账号已锁定,请稍后再试")
113+
raise LoginException(data="", message="账号已锁定,请稍后再试")
113114
captcha_value = await request.app.state.redis.get(f'captcha_codes:{login_user.session_id}')
114115
if not captcha_value:
115-
return '验证码已失效'
116+
logger.warning("验证码已失效")
117+
raise LoginException(data="", message="验证码已失效")
116118
if login_user.captcha != str(captcha_value):
117-
return '验证码错误'
119+
logger.warning("验证码错误")
120+
raise LoginException(data="", message="验证码错误")
118121
user = login_by_account(query_db, login_user.user_name)
119122
if not user[0]:
120-
return '用户不存在'
123+
logger.warning("用户不存在")
124+
raise LoginException(data="", message="用户不存在")
121125
if not verify_password(login_user.password, user[0].password):
122126
cache_password_error_count = await request.app.state.redis.get(f"password_error_count:{login_user.user_name}")
123127
password_error_counted = 0
@@ -128,10 +132,13 @@ async def authenticate_user(request: Request, query_db: Session, login_user: Use
128132
if password_error_count > 5:
129133
await request.app.state.redis.delete(f"password_error_count:{login_user.user_name}")
130134
await request.app.state.redis.set(f"account_lock:{login_user.user_name}", login_user.user_name, ex=timedelta(minutes=10))
131-
return '10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试'
132-
return '密码错误'
135+
logger.warning("10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试")
136+
raise LoginException(data="", message="10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试")
137+
logger.warning("密码错误")
138+
raise LoginException(data="", message="密码错误")
133139
if user[0].status == '1':
134-
return '用户已停用'
140+
logger.warning("用户已停用")
141+
raise LoginException(data="", message="用户已停用")
135142
await request.app.state.redis.delete(f"password_error_count:{login_user.user_name}")
136143
return user
137144

dash-fastapi-backend/utils/response_util.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,12 @@ class AuthException(Exception):
7979
def __init__(self, data: str = None, message: str = None):
8080
self.data = data
8181
self.message = message
82+
83+
84+
class LoginException(Exception):
85+
"""
86+
自定义登录异常LoginException
87+
"""
88+
def __init__(self, data: str = None, message: str = None):
89+
self.data = data
90+
self.message = message

0 commit comments

Comments
 (0)