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
中
import Guardian
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)
}))
或者自定义返回其他类型的数据...
目前支持设置的间隔有
case .second
case .minute
case .hour
case .day
如果您有任何问题或建议,您可以提出一个 Issues 或联系我
邮箱 : hi@jinxiansen.com
Twitter : @Jinxiansen
Guardian 在 MIT 许可证 下发布。 详情请参阅 LICENSE。