Initial FastAPI admin auth scaffold
This commit is contained in:
1
app/middleware/admin/__init__.py
Normal file
1
app/middleware/admin/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""Admin middleware."""
|
||||
16
app/middleware/admin/admin_token_middleware.py
Normal file
16
app/middleware/admin/admin_token_middleware.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from fastapi import Request
|
||||
|
||||
from app.common.context import current_admin_id
|
||||
from app.lib.jwt.jwt import Jwt
|
||||
from app.lib.jwt.token import JwtToken
|
||||
from app.middleware.token.abstract_token_middleware import AbstractTokenMiddleware
|
||||
|
||||
|
||||
class AdminTokenMiddleware(AbstractTokenMiddleware):
|
||||
async def parser_token(self, jwt: Jwt, raw_token: str) -> JwtToken:
|
||||
return await jwt.parser_access_token(raw_token)
|
||||
|
||||
def set_context(self, request: Request, token: JwtToken) -> None:
|
||||
admin_id = token.admin_id
|
||||
current_admin_id.set(admin_id)
|
||||
request.state.current_admin_id = admin_id
|
||||
34
app/middleware/admin/permission_middleware.py
Normal file
34
app/middleware/admin/permission_middleware.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from collections.abc import Iterable
|
||||
|
||||
from fastapi import Depends, Request
|
||||
|
||||
from app.common.context import current_admin_id
|
||||
from app.common.repository.admin_user_repository import AdminUserRepository
|
||||
from app.constants.admin_code import AdminCode
|
||||
from app.constants.model.admin_user.admin_user_status_code import AdminUserStatusCode
|
||||
from app.core.dependencies import get_admin_user_repository
|
||||
from app.exception.err_exception import ErrException
|
||||
|
||||
|
||||
class PermissionMiddleware:
|
||||
def __init__(self, permissions: Iterable[str] | None = None) -> None:
|
||||
self.permissions = tuple(permissions or ())
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
request: Request,
|
||||
user_repository: AdminUserRepository = Depends(get_admin_user_repository),
|
||||
) -> None:
|
||||
admin_id = getattr(request.state, "current_admin_id", current_admin_id.get())
|
||||
if admin_id <= 0:
|
||||
raise ErrException("账户不存在")
|
||||
|
||||
admin_user = await user_repository.find_by_id(admin_id)
|
||||
if admin_user is None:
|
||||
raise ErrException("账户不存在")
|
||||
if admin_user.status == AdminUserStatusCode.DISABLE:
|
||||
raise ErrException("账号已禁用", AdminCode.DISABLED)
|
||||
|
||||
request.state.current_admin_user = admin_user
|
||||
if self.permissions and admin_user.user_type != "SuperAdmin":
|
||||
raise ErrException("暂无权限", AdminCode.FORBIDDEN)
|
||||
13
app/middleware/admin/refresh_admin_token_middleware.py
Normal file
13
app/middleware/admin/refresh_admin_token_middleware.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from fastapi import Request
|
||||
|
||||
from app.lib.jwt.jwt import Jwt
|
||||
from app.lib.jwt.token import JwtToken
|
||||
from app.middleware.token.abstract_token_middleware import AbstractTokenMiddleware
|
||||
|
||||
|
||||
class RefreshAdminTokenMiddleware(AbstractTokenMiddleware):
|
||||
async def parser_token(self, jwt: Jwt, raw_token: str) -> JwtToken:
|
||||
return await jwt.parser_refresh_token(raw_token)
|
||||
|
||||
def set_context(self, request: Request, token: JwtToken) -> None:
|
||||
return None
|
||||
Reference in New Issue
Block a user