mirror of
https://github.com/fastapi-practices/fastapi-best-architecture.git
synced 2026-09-21 13:12:24 +00:00
Enable login interface captcha function (#165)
* enable captcha login * Delete menu meta column * Update the login interface rate limit
This commit is contained in:
@@ -26,7 +26,7 @@ async def swagger_user_login(form_data: OAuth2PasswordRequestForm = Depends()) -
|
||||
'/login',
|
||||
summary='用户登录',
|
||||
description='json 格式登录, 仅支持在第三方api工具调试接口, 例如: postman',
|
||||
dependencies=[Depends(RateLimiter(times=5, minutes=15))],
|
||||
dependencies=[Depends(RateLimiter(times=5, minutes=1))],
|
||||
)
|
||||
async def user_login(request: Request, obj: AuthLogin, background_tasks: BackgroundTasks):
|
||||
access_token, refresh_token, access_expire, refresh_expire, user = await AuthService().login(
|
||||
|
||||
@@ -22,7 +22,6 @@ class Menu(Base):
|
||||
icon: Mapped[str | None] = mapped_column(String(100), default=None, comment='菜单图标')
|
||||
path: Mapped[str | None] = mapped_column(String(200), default=None, comment='路由地址')
|
||||
menu_type: Mapped[int] = mapped_column(default=0, comment='菜单类型(0目录 1菜单 2按钮)')
|
||||
meta: Mapped[dict | None] = mapped_column(JSON, default=None, comment='菜单元数据')
|
||||
component: Mapped[str | None] = mapped_column(String(255), default=None, comment='组件路径')
|
||||
perms: Mapped[str | None] = mapped_column(String(100), default=None, comment='权限标识')
|
||||
status: Mapped[int] = mapped_column(default=1, comment='菜单状态(0停用 1正常)')
|
||||
|
||||
@@ -17,8 +17,7 @@ class Auth(SchemaBase):
|
||||
|
||||
|
||||
class AuthLogin(Auth):
|
||||
# captcha: str
|
||||
pass
|
||||
captcha: str
|
||||
|
||||
|
||||
class CreateUser(Auth):
|
||||
|
||||
@@ -12,6 +12,7 @@ from backend.app.common.enums import LoginLogStatus
|
||||
from backend.app.common.exception import errors
|
||||
from backend.app.common.jwt import get_token
|
||||
from backend.app.common.redis import redis_client
|
||||
from backend.app.common.response.response_code import CustomCode
|
||||
from backend.app.core.conf import settings
|
||||
from backend.app.crud.crud_user import UserDao
|
||||
from backend.app.database.db_mysql import async_db_session
|
||||
@@ -50,11 +51,11 @@ class AuthService:
|
||||
raise errors.AuthorizationError(msg='密码错误')
|
||||
elif not current_user.status:
|
||||
raise errors.AuthorizationError(msg='用户已锁定, 登陆失败')
|
||||
# captcha_code = await redis_client.get(f'{settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{request.state.ip}')
|
||||
# if not captcha_code:
|
||||
# raise errors.AuthorizationError(msg='验证码失效,请重新获取')
|
||||
# if captcha_code.lower() != obj.captcha.lower():
|
||||
# raise errors.CustomError(error=CustomCode.CAPTCHA_ERROR)
|
||||
captcha_code = await redis_client.get(f'{settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{request.state.ip}')
|
||||
if not captcha_code:
|
||||
raise errors.AuthorizationError(msg='验证码失效,请重新获取')
|
||||
if captcha_code.lower() != obj.captcha.lower():
|
||||
raise errors.CustomError(error=CustomCode.CAPTCHA_ERROR)
|
||||
await UserDao.update_login_time(db, obj.username, self.login_time)
|
||||
user = await UserDao.get(db, current_user.id)
|
||||
access_token, access_token_expire_time = await jwt.create_access_token(
|
||||
|
||||
Reference in New Issue
Block a user