FreeAuth 依赖项

FreeAuth 提供了几个可注入到您的接口路由中的依赖项,您可以直接通过 FreeAuthApp 实例调用。

current_user

您可以通过在接口路由中注入该依赖项获取当前登录的用户对象,如果用户未登录,将返回 None,例如:

import json

from fastapi import Depends, Response
from freeauth.db.auth.auth_qry_async_edgeql import (
  create_audit_log,
  sign_out,
)
from freeauth.ext.fastapi_ext.utils import get_client_info


@router.post("/logout")
async def logout(
  resp: Response,
  client_info=Depends(get_client_info),
  token=Depends(auth_app.get_access_token),
  user=Depends(auth_app.current_user),
):
    if not token:
      return "ok"

    await sign_out(auth_app.db, access_token=token.access_token)
    if current_user:
        await create_audit_log(
            auth_app.db,
            user_id=user.id,
            client_info=json.dumps(client_info),
            status_code="OK",
            event_type="SignOut",
        )
    resp.delete_cookie("access_token")
    return "ok"

current_user_or_401

用于从请求中获取当前登录的用户对象。如果用户未登录,则抛出 HTTPException 异常,状态码为 401(未授权),例如:

@router.get("/protected-route")
def protected_route(user=Depends(auth_app.current_user_or_401)):
    return f"Hello, {user.name or user.username}"

perm_accepted()

用于判断当前登录用户是否拥有指定的权限,perm_accepted 支持同时传入多个权限代码。如果用户具有指定的权限,请求将继续进行,并返回当前登录的用户对象。否则会抛出 HTTPException,状态码为 403(禁止访问),例如:

@router.get(
  "/items/{item_id}"
  dependencies=[Depends(auth_app.perm_accepted("view:item"))],
)
def show_item(item_id: int):
    ...

get_client_info

用于获取当前登录用户的客户端信息,包含用户代理(User-Agent)数据,示例见 current_user