#actix-web #permissions #input-validation #authorization #actix #service-request #web-services

actix-permissions

Actix Web 的权限和输入验证扩展。actix guard 的替代品,可访问 HttpRequest 和 Payload。

11 个版本 (4 个稳定版)

2.0.0 2022 年 4 月 12 日
2.0.0-beta.42022 年 4 月 11 日
1.0.2 2022 年 4 月 8 日
1.0.1 2022 年 3 月 29 日
0.1.1 2022 年 3 月 8 日

Web 编程 中排名 1353

MIT/Apache

26KB
428

Actix Permissions 持续集成 cargo-badge license-badge

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 错误。您可能希望在不同之间切换 UnauthorizedForbidden,也许要自定义 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