10个版本 (5个重大变更)

0.6.0 2024年4月9日
0.5.1 2024年3月2日
0.5.0 2023年11月27日
0.4.1 2023年4月26日
0.1.0 2022年2月9日

网络编程 中排名 186

Download history 4920/week @ 2024-04-25 5681/week @ 2024-05-02 4472/week @ 2024-05-09 4224/week @ 2024-05-16 5081/week @ 2024-05-23 3854/week @ 2024-05-30 6696/week @ 2024-06-06 4779/week @ 2024-06-13 3830/week @ 2024-06-20 5359/week @ 2024-06-27 3983/week @ 2024-07-04 3689/week @ 2024-07-11 3077/week @ 2024-07-18 3672/week @ 2024-07-25 5951/week @ 2024-08-01 4405/week @ 2024-08-08

每月下载量 17,774
9 包中使用(直接使用8个)

MIT 许可证

41KB
739

License Crates.io Docs.rs

axum-client-ip

Axum客户端IP地址提取器

为什么有不同提取器?

对于客户端IP有两种不同的用途,应分别处理。

  1. 你不能容忍欺骗的可能性(你正在处理速率限制、垃圾邮件防护等)。在这种情况下,你应该使用 SecureClientIp 或特定头部的提取器。
  2. 你可以为了统计上更好的IP确定而牺牲潜在的欺骗。例如,当位置的正确性对你的应用程序不是关键时,你可以使用IP进行地理位置。对于这种类型的操作,你可以使用 InsecureClientIp

关于权衡的深入探讨,请参阅Adam Pritchard的文章

SecureClientIp 与特定头部提取器

除了 SecureClientIp 之外,还有 ForwardedRightmostForwardedXForwardedForRightmostXForwardedForFlyClientIpTrueClientIpCfConnectingIpXRealIp 提取器。

它们的工作方式相同——通过从指定的头部提取IP。唯一的区别在于目标头部的指定。使用SecureClientIp,您可以在运行时指定头部,因此您可以为此设置使用例如环境变量(参见实现示例)。而使用特定的提取器时,如果您想更改目标头部(例如,您正在迁移到另一个云服务提供商),则需要重新编译您的代码。为了减轻这种变化,您可以创建一个类型别名,例如type InsecureIp = XRealIp,并在处理程序中使用它,然后更改将仅影响一行。

用法

use axum::{routing::get, Router};
use axum_client_ip::{InsecureClientIp, SecureClientIp, SecureClientIpSource};
use std::net::SocketAddr;

async fn handler(insecure_ip: InsecureClientIp, secure_ip: SecureClientIp) -> String {
    format!("{insecure_ip:?} {secure_ip:?}")
}

#[tokio::main]
async fn main() {
    async fn handler(insecure_ip: InsecureClientIp, secure_ip: SecureClientIp) -> String {
        format!("{insecure_ip:?} {secure_ip:?}")
    }

    let app = Router::new().route("/", get(handler))
        .layer(SecureClientIpSource::ConnectInfo.into_extension());

    let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
    let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
    axum::serve(
        listener,
        // Don't forget to add `ConnectInfo` if you aren't behind a proxy
        app.into_make_service_with_connect_info::<SocketAddr>(),
    )
    .await
    .unwrap()
}

Axum提取器的一个常见问题

这个提取器最常见的问题是在消费了一个正文之后使用它,例如axum::extract::Json。要修复此问题,请重新排列处理程序定义中的提取器,将正文消费移至末尾,参见详情

贡献

我们感谢所有形式的贡献,谢谢!

关于README的说明

README的大部分内容是由cargo-sync-readme自动从crate文档中复制而来。这样,README始终与文档保持同步,示例经过测试。

因此,如果您想更改在<!-- cargo-sync-readme start --><!-- cargo-sync-readme end -->标记之间的README的一部分,请不要直接编辑README.md,而是更改顶部src/lib.rs上的文档,然后使用以下命令同步README:

cargo sync-readme

(确保已安装cargo命令)

cargo install cargo-sync-readme

如果您已安装rusty-hook,则更改将在提交时自动应用。

许可证

本项目采用MIT许可证

依赖关系

~6–15MB
~188K SLoC