11 个版本 (4 个稳定版)
2.0.0 | 2022 年 4 月 12 日 |
---|---|
2.0.0-beta.4 | 2022 年 4 月 11 日 |
1.0.2 | 2022 年 4 月 8 日 |
1.0.1 | 2022 年 3 月 29 日 |
0.1.1 | 2022 年 3 月 8 日 |
在 Web 编程 中排名 1353
26KB
428 行
Actix Permissions
Actix Web 的权限和输入验证扩展。actix guard 的替代品,可访问应用程序数据注入、HttpRequest 和 Payload。权限是灵活的,请参阅 示例目录 了解一些使用案例。
您可以将权限检查编写为一个函数或一个结构体。
此代码
async fn is_allowed(
req: HttpRequest
) -> actix_web::Result<bool> {
todo!();
}
几乎与以下代码相同
struct IsAllowed;
impl Permission<()> for IsAllowed {
type Future = Ready<actix_web::Result<bool>>;
fn call(&self, req: HttpRequest, ctx: ()) -> Ready<actix_web::Result<bool>> {
todo!();
}
}
示例
依赖项
[dependencies]
actix-permissions = "2.0.0"
代码
use actix_permissions::*;
use actix_web::web::Data;
use actix_web::*;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct MyStatus {
pub status: Option<String>,
}
async fn dummy_permission_check(
_req: HttpRequest,
dummy_service: web::Data<DummyService>,
data: web::Query<MyStatus>,
) -> actix_web::Result<bool> {
// Unecessary complicating permission check to show what it can do.
// You have access to request, payload, and all injected dependencies through app_data.
Ok(dummy_service.check(data.status.clone()))
}
struct DummyService;
impl DummyService {
pub fn check(&self, value: Option<String>) -> bool {
value == Some("all".to_string())
}
}
async fn index() -> Result<String, Error> {
Ok("Hi there!".to_string())
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new().app_data(Data::new(DummyService)).service(
web::scope("").route(
"/",
permission()
.check(web::get())
.validate(dummy_permission_check)
.to(index)
.build(),
),
)
})
.bind("127.0.0.1:8888")?
.run()
.await
}
使用案例
请参阅 示例目录。您可以使用 actix-permissions 进行基于角色的授权检查,如 基于角色的授权 示例。
hello-world 示例只是一个概念证明,展示如何设置权限、访问服务请求、有效负载和注入的服务。
权限拒绝
默认情况下,对于失败的权限检查,将返回 403 错误。您可能希望在不同之间切换 Unauthorized
和 Forbidden
,也许要自定义 403 禁止消息。这就是为什么有 check_with_custom_deny
的原因。有关更多信息,请参阅 基于角色的授权示例。
权限链式处理
尚未实现。这是因为 service.rs
中实现的方式。对于每个 Permission
,都有一个 FromRequest
实现。每个 FromRequest
都消耗 Payload
,因此需要每次都克隆 Payload
。如果您需要权限链式处理或有一个想法,请打开一个 新问题。
贡献
本项目欢迎各种贡献。没有哪项贡献太小!
如果您想为该项目做出贡献但不知道如何开始,或者需要帮助与该项目相关的事项,请随时发送电子邮件至 https://www.eisberg-labs.com/(底部有联系表单)。
关于贡献的一些提示可以在 Contributing.md 中找到。
行为准则
本项目遵循 Rust 行为准则。
许可证
在 MIT 许可证 和 Apache 许可证 下分发。
依赖项
~14–28MB
~465K SLoC