实现自定义身份验证

Litestar 导出了 AbstractAuthenticationMiddleware, 这是一个实现了 MiddlewareProtocol抽象基类 <abstract base class>`(ABC)。 要使用此类作为基础为您的应用添加身份验证,请子类化它并实现抽象方法 :meth:`~.middleware.authentication.AbstractAuthenticationMiddleware.authenticate_request

通过子类化 AbstractAuthenticationMiddleware 为您的应用添加身份验证
from litestar.middleware import (
   AbstractAuthenticationMiddleware,
   AuthenticationResult,
)
from litestar.connection import ASGIConnection


class MyAuthenticationMiddleware(AbstractAuthenticationMiddleware):
   async def authenticate_request(
       self, connection: ASGIConnection
   ) -> AuthenticationResult:
       # 在这里做一些事情。
       ...

如您所见,authenticate_request 是一个异步函数,它接收一个连接实例,并应该返回一个 AuthenticationResult 实例,它是一个 dataclass,有两个属性:

  1. user:表示用户的非可选值。它被类型化为 Any,因此它接收任何值,包括 None

  2. auth:表示身份验证方案的可选值。默认为 None

这些值然后作为 scope 字典的一部分设置,并分别作为 Request.userRequest.auth 可用于 HTTP 路由处理器, 以及 WebSocket.userWebSocket.auth 可用于 websocket 路由处理器。

创建自定义身份验证中间件

由于上述内容在抽象层面上很难理解,让我们看一个例子。

我们首先创建一个用户模型。它可以使用 msgspec、Pydantic、ODM、ORM 等实现。 为了这个示例,让我们假设它是一个 dataclass:

我们现在可以创建我们的身份验证中间件:

最后,我们需要将中间件传递给 Litestar 构造函数:

就是这样。CustomAuthenticationMiddleware 现在将为每个请求运行,我们可以在 http 路由处理器中以以下方式访问这些:

或者对于 websocket 路由:

如果您想要在配置的路由之外排除单个路由:

当然,也可以对依赖项使用相同类型的机制: