Guardian Version Swift Version Vapor Version GitHub license

[中文版🇨🇳]

Guardian 是一个基于 Vapor 3 的中间件,它基于 IP 地址 + 访问 URL 限制来自客户端的请求数量。它的工作原理是将客户端的 IP 地址添加到缓存中,并计算客户端在添加 GuardianMiddleware 时定义的生命周期内可以发出的请求数量,并在达到限制时返回 HTTP 429 (请求过多)。超过时间限制后,可以重新发起请求,并且支持自定义返回数据。Guardian 的产生是因为 gatekeeper 只支持 vapor 2,非常感谢原作者!🍺

考虑到局域网中可能存在公共 IP 地址,请适当增加单位阈值。

安装 📦

要将其包含在你的包中,请将以下内容添加到你的 Package.swift 文件中。

let package = Package(
    name: "Project",
    dependencies: [
        ...
        .package(url: "https://github.com/Jinxiansen/Guardian.git", from: "3.0.0"),
    ],
    targets: [
      .target(name: "App", dependencies: ["Guardian", ... ])
    ]
)
        

使用 🚀

有两种使用方式:

Guardian 可配置字段:最大访问次数、时间单位和要使用的缓存。

如果你没有提供自己的缓存,Guardian 将创建自己的内存缓存。

// Each api URL is limited to 20 times per minute
let guardian = GuardianMiddleware(rate: Rate(limit: 20, interval: .minute)) 

或者

configure.swift

  1. 导入头文件
import Guardian
  1. 在 services 前加入
var middlewares = MiddlewareConfig() 

middlewares.use(GuardianMiddleware(rate: Rate(limit: 25, interval: .minute), closure: { (req) -> EventLoopFuture<Response>? in
	let view = ["result":"429","message":"The request is too fast. Please try again later!"]
	return try view.encode(for: req)
}))

services.register(middlewares)

方法二

将中间件添加到路由组

 
let group = router.grouped(GuardianMiddleware(rate: Rate(limit: 25, interval: .minute)))

group.get("welcome") { req in
    return "hello,world !"
}

支持自定义返回数据 📌

Guardian 增加了对自定义返回数据的支持,如下例所示

返回一个 JSON 对象

middlewares.use(GuardianMiddleware(rate: Rate(limit: 20, interval: .minute), closure: { (req) -> EventLoopFuture<Response>? in
	let view = ["result":"429","message":"The request is too fast. Please try again later!"]
	return try view.encode(for: req)
}))

或者返回一个 Leaf/Html 网页

middlewares.use(GuardianMiddleware(rate: Rate(limit: 25, interval: .minute), closure: { (req) -> EventLoopFuture<Response>? in
	let view = try req.view().render("leaf/busy")
	return try view.encode(for: req)
}))

或者自定义返回其他类型的数据...

Rate.Interval 枚举类型

目前支持设置的间隔有

case .second
case .minute
case .hour
case .day

联系方式

如果您有任何问题或建议,您可以提出一个 Issues 或联系我

邮箱 : hi@jinxiansen.com

Twitter : @Jinxiansen

许可证 📄

Guardian 在 MIT 许可证 下发布。 详情请参阅 LICENSE。