7 个版本
0.3.1 | 2021 年 12 月 17 日 |
---|---|
0.3.0 | 2021 年 12 月 4 日 |
0.2.0 | 2021 年 3 月 15 日 |
0.1.3 | 2020 年 10 月 10 日 |
0.1.2 | 2020 年 9 月 26 日 |
#450 在 HTTP 服务器
每月 31 次下载
31KB
325 代码行
actix-ip-filter
Actix IP 过滤器中间件。支持 glob 模式。
文档
- API 文档
- Cargo 包:actix-ip-filter
用法
use actix_web::{App, HttpServer, HttpRequest, web, middleware};
use actix_ip_filter::IPFilter;
async fn index(req: HttpRequest) -> &'static str {
"Hello world"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new()
// enable logger
.wrap(middleware::Logger::default())
// setup ip filters
.wrap(
IPFilter::new()
.allow(vec!["172.??.6*.12"])
.block(vec!["192.168.1.222"])
)
// register simple route, handle all methods
.service(web::resource("/").to(index))
)
.bind("0.0.0.0:8080")?;
Ok(())
}
限制到特定路径
您可以将允许/阻止操作限制到代表 URL 路径的一组模式。以下代码将只允许/阻止与以下模式匹配的路径:/my/path*
和 /my/other/*.csv
。
use actix_web::{App, HttpServer, HttpRequest, web, middleware};
use actix_ip_filter::IPFilter;
async fn i_am_protected() -> &'static str {
"I am a protected resource"
}
async fn i_am_unprotected() -> &'static str {
"I am NOT a protected resource"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new()
// enable logger
.wrap(middleware::Logger::default())
// setup ip filters
.wrap(
IPFilter::new()
.allow(vec!["172.??.6*.12"])
.block(vec!["192.168.1.222"])
.limit_to(vec!["/my/path/*"])
)
// register simple protected route
.service(web::resource("/my/path/resource").to(i_am_protected))
// register simple unprotected route
.service(web::resource("/other/path/resource").to(i_am_unprotected))
)
.bind("0.0.0.0:8000");
Ok(())
}
允许和阻止回调
您可以添加一个允许处理程序和一个阻止处理程序。这些处理程序将在请求成功通过 IP 过滤器(允许处理程序)或被阻止时被调用(阻止处理程序)。这允许您自定义错误响应。在未受保护的路径上不会调用这些回调。
允许处理程序。
允许处理程序必须接受三个位置参数,没有返回类型
use actix_ip_filter::IPFilter;
use actix_web::dev::ServiceRequest;
fn my_allow_handler(flt: &IPFilter, ip: &str, req: &ServiceRequest) {
//Do smth
}
传递给函数的参数是 IPFilter
的借用、请求的 IP 地址和请求。
您可以将处理程序附加到 IPFilter
,如下所示
use actix_web::{App, HttpServer, HttpRequest, web, middleware};
use actix_ip_filter::IPFilter;
use actix_web::dev::ServiceRequest;
fn my_allow_handler(flt: &IPFilter, ip: &str, req: &ServiceRequest) {
//Do smth
}
async fn i_am_protected() -> &'static str {
"I am a protected resource"
}
async fn i_am_unprotected() -> &'static str {
"I am NOT a protected resource"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new()
// enable logger
.wrap(middleware::Logger::default())
// setup ip filters
.wrap(
IPFilter::new()
.allow(vec!["172.??.6*.12"])
.block(vec!["192.168.1.222"])
.limit_to(vec!["/my/path/*"])
.on_allow(my_allow_handler)
)
// register simple protected route
.service(web::resource("/my/path/resource").to(i_am_protected))
// register simple unprotected route
.service(web::resource("/other/path/resource").to(i_am_unprotected))
)
.bind("0.0.0.0:8000");
Ok(())
}
阻止处理程序
允许处理程序必须接受三个位置参数和可选的响应体响应
use actix_ip_filter::IPFilter;
use actix_web::dev::ServiceRequest;
use actix_web::HttpResponse;
fn my_block_handler(flt: &IPFilter, ip: &str, req: &ServiceRequest) -> Option<HttpResponse> {
Some(HttpResponse::UseProxy().json("{\"result\": \"error\"}"))
}
传递给函数的参数是 IPFilter
的借用、请求的 IP 地址和请求。
如果处理程序返回 None,则使用默认错误响应。您可以将处理程序附加到 IPFilter
,如下所示
use actix_web::{App, HttpServer, HttpRequest, web, middleware};
use actix_ip_filter::IPFilter;
use actix_web::dev::ServiceRequest;
use actix_web::HttpResponse;
fn my_block_handler(flt: &IPFilter, ip: &str, req: &ServiceRequest) -> Option<HttpResponse> {
Some(HttpResponse::UseProxy().json("{\"result\": \"error\"}"))
}
async fn i_am_protected() -> &'static str {
"I am a protected resource"
}
async fn i_am_unprotected() -> &'static str {
"I am NOT a protected resource"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new()
// enable logger
.wrap(middleware::Logger::default())
// setup ip filters
.wrap(
IPFilter::new()
.allow(vec!["172.??.6*.12"])
.block(vec!["192.168.1.222"])
.limit_to(vec!["/my/path/*"])
.on_block(my_block_handler)
)
// register simple protected route
.service(web::resource("/my/path/resource").to(i_am_protected))
// register simple unprotected route
.service(web::resource("/other/path/resource").to(i_am_unprotected))
)
.bind("0.0.0.0:8000");
Ok(())
}
许可证:MIT
依赖项
~15–26MB
~455K SLoC