Skip to content
This repository has been archived by the owner on Jul 6, 2024. It is now read-only.

Latest commit

 

History

History
142 lines (94 loc) · 3.63 KB

README_CN.md

File metadata and controls

142 lines (94 loc) · 3.63 KB



Guardian Version Swift Version Vapor Version GitHub license

Guardian 是一个基于 Swift 服务端框架 Vapor 3 的 Middleware,它根据IP地址 + 访问的 URL 来限制自客户端的请求数量,支持自定义返回数据类型。 它的工作原理是将客户端 IP 地址添加到缓存中,并计算客户端在添加 GuardianMiddleware 时定义的生命周期内可以做出的请求次数,并在达到限制时返回 HTTP 429(太多请求)。 当限制时间过了后,可以重新发起请求。

考虑到如果局域网内公用1个 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 将自行创建在内存缓存。

let guardian = GuardianMiddleware(rate: Rate(limit: 20, interval: .minute)) //例如:每个 api 地址每分钟限20次调用

configure.swift

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

middlewares.use(GuardianMiddleware(rate: Rate(limit: 22, interval: .minute)))

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 * web页面,

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

Contacts

如果有什么疑问和建议可以提1个 Issues 或联系我:

Email : [email protected]

Twitter : @Jinxiansen

License 📄

Guardian is released under the MIT license. See LICENSE for details.