守卫¶
守卫是 可调用对象,它们接收两个参数 - connection,
它是 Request 或 WebSocket 实例
(都是 ASGIConnection 的子类),以及 route_handler,
它是 BaseRouteHandler 的副本。它们的作用是通过验证连接是否被允许访问相关的端点处理器
来 授权 请求。如果验证失败,守卫应该引发 HTTPException,通常是带有 status_code 为 401
的 NotAuthorizedException。
为了说明这一点,我们将在 Litestar 应用中实现一个基本的基于角色的授权系统。正如我们对 authentication
所做的那样,我们将假设我们添加了某种持久层,而不在示例中实际指定它。
我们首先创建一个具有两个角色的 Enum - consumer 和 admin:
我们的 User 模型现在看起来像这样:
鉴于 User 模型有一个 role 属性,我们可以使用它来授权请求。
让我们创建一个只允许管理员用户访问某些路由处理器的守卫,然后将其添加到路由处理器函数:
在这里,admin_user_guard 守卫检查用户是否是管理员。
由于 JWT 中间件,连接附加了一个 user 对象,请参阅 authentication,
特别是 JWTAuth.retrieve_user_handler() 方法。
因此,只有管理员用户才能向 create_user 处理器发送 post 请求。
守卫作用域¶
守卫是 Litestar 分层架构 的一部分, 可以在应用的所有层上声明 - Litestar 实例、路由器、控制器和单个路由处理器:
守卫在 Litestar 应用中的位置取决于所需的访问控制范围和级别:
限制应该应用于单个路由处理器吗?
访问控制是针对控制器内的所有操作吗?
您是否想要保护特定路由器管理的所有路由?
或者您需要在整个应用中实施访问控制?
如您在上面的示例中所看到的 - guards 是一个 list。这意味着您可以在每一层添加 多个 守卫。
与 依赖项 不同,守卫不会相互覆盖,而是 累积 的。
这意味着您可以在应用的不同层定义守卫,它们将组合在一起。
小心
如果守卫放置在控制器或应用级别,它们 将 在所有 OPTIONS 请求上执行。
有关更多详细信息,包括解决方法,请参阅 https://github.com/litestar-org/litestar/issues/2314。
路由处理器的"opt"键¶
有时可能需要在路由处理器本身上设置一些值 - 这些可以是权限或其他标志。 这可以通过路由处理器的 opts kwarg 来实现
为了说明这一点,假设我们想要一个由"secret"令牌守护的端点,为此我们创建以下守卫: