1111from module_admin .dao .login_dao import *
1212from module_admin .service .user_service import UserService
1313from module_admin .dao .user_dao import *
14- from config .env import JwtConfig , RedisInitKeyConfig
14+ from config .env import AppConfig , JwtConfig , RedisInitKeyConfig
1515from utils .pwd_util import *
1616from utils .response_util import *
1717from utils .message_util import *
@@ -155,6 +155,22 @@ async def logout_services(request: Request, session_id: str):
155155 return True
156156
157157
158+ async def check_login_ip (request : Request , login_user : UserLogin ):
159+ """
160+ 校验用户登录ip是否在黑名单内
161+ :param request: Request对象
162+ :param login_user: 登录用户对象
163+ :return: 校验结果
164+ """
165+ black_ip_value = await request .app .state .redis .get (
166+ f"{ RedisInitKeyConfig .SYS_CONFIG .get ('key' )} :sys.login.blackIPList" )
167+ black_ip_list = black_ip_value .split (',' ) if black_ip_value else []
168+ if login_user .login_info .get ('ipaddr' ) in black_ip_list :
169+ logger .warning ("当前IP禁止登录" )
170+ raise LoginException (data = "" , message = "当前IP禁止登录" )
171+ return True
172+
173+
158174async def check_login_captcha (request : Request , login_user : UserLogin ):
159175 """
160176 校验用户登录验证码
@@ -180,12 +196,18 @@ async def authenticate_user(request: Request, query_db: Session, login_user: Use
180196 :param login_user: 登录用户对象
181197 :return: 校验结果
182198 """
199+ await check_login_ip (request , login_user )
183200 account_lock = await request .app .state .redis .get (f"{ RedisInitKeyConfig .ACCOUNT_LOCK .get ('key' )} :{ login_user .user_name } " )
184201 if login_user .user_name == account_lock :
185202 logger .warning ("账号已锁定,请稍后再试" )
186203 raise LoginException (data = "" , message = "账号已锁定,请稍后再试" )
187- # 判断是否开启验证码,开启则验证,否则不验证
188- if login_user .captcha_enabled :
204+ # 判断请求是否来自于api文档
205+ request_from_swagger = request .headers .get ('referer' ).endswith ('docs' ) if request .headers .get ('referer' ) else False
206+ request_from_redoc = request .headers .get ('referer' ).endswith ('redoc' ) if request .headers .get ('referer' ) else False
207+ # 判断是否开启验证码,开启则验证,否则不验证(dev模式下来自API文档的登录请求不检验)
208+ if not login_user .captcha_enabled or ((request_from_swagger or request_from_redoc ) and AppConfig .app_env == 'dev' ):
209+ pass
210+ else :
189211 await check_login_captcha (request , login_user )
190212 user = login_by_account (query_db , login_user .user_name )
191213 if not user :
0 commit comments