实现自定义身份验证¶
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,有两个属性:
user:表示用户的非可选值。它被类型化为Any,因此它接收任何值,包括None。auth:表示身份验证方案的可选值。默认为None。
这些值然后作为 scope 字典的一部分设置,并分别作为
Request.user 和
Request.auth 可用于 HTTP 路由处理器,
以及 WebSocket.user 和
WebSocket.auth 可用于 websocket 路由处理器。
创建自定义身份验证中间件¶
由于上述内容在抽象层面上很难理解,让我们看一个例子。
我们首先创建一个用户模型。它可以使用 msgspec、Pydantic、ODM、ORM 等实现。 为了这个示例,让我们假设它是一个 dataclass:
我们现在可以创建我们的身份验证中间件:
最后,我们需要将中间件传递给 Litestar 构造函数:
就是这样。CustomAuthenticationMiddleware 现在将为每个请求运行,我们可以在 http 路由处理器中以以下方式访问这些:
或者对于 websocket 路由:
如果您想要在配置的路由之外排除单个路由:
当然,也可以对依赖项使用相同类型的机制: