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
每月下载量 17,774
在 9 个 包中使用(直接使用8个)
41KB
739 行
axum-client-ip
Axum客户端IP地址提取器
为什么有不同提取器?
对于客户端IP有两种不同的用途,应分别处理。
- 你不能容忍欺骗的可能性(你正在处理速率限制、垃圾邮件防护等)。在这种情况下,你应该使用
SecureClientIp
或特定头部的提取器。 - 你可以为了统计上更好的IP确定而牺牲潜在的欺骗。例如,当位置的正确性对你的应用程序不是关键时,你可以使用IP进行地理位置。对于这种类型的操作,你可以使用
InsecureClientIp
。
关于权衡的深入探讨,请参阅Adam Pritchard的文章
SecureClientIp
与特定头部提取器
除了 SecureClientIp
之外,还有 Forwarded
、RightmostForwarded
、XForwardedFor
、RightmostXForwardedFor
、FlyClientIp
、TrueClientIp
、CfConnectingIp
和 XRealIp
提取器。
它们的工作方式相同——通过从指定的头部提取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