轻松处理身份验证范围。
将以下软件包依赖项添加到您的 Package.swift
.package(url: "https://github.com/sersoft-gmbh/auth-scope", from: "4.0.0"),
您要使用的主要对象是 Scope<AccessRange>
。它是通用的,并封装了围绕给定 AccessRange
类型的所有逻辑。由于 Scope
无法知道您有哪些访问范围,因此您需要自行提供它们。通常,这是通过使用 enum
并使其符合 AccessRangeProtocol
来完成的
enum MyAccessRange: String, AccessRangeProtocol, CaseIterable {
case readPosts = "posts:read"
case writePosts = "posts:write"
case readUsers = "users:read"
case writeUsers = "users:write"
}
然后,您可以将您的 enum
与 Scope
一起使用
let postsScope = Scope<MyAccessRange>(accessRanges: .readPosts, .writePosts)
postsScope.contains(.writePosts) // -> true
postsScope.contains(.readUsers) // -> false
Scope
符合 SetAlgebra
,以简化访问范围的检查
let completeScope = Scope<MyAccessRange>.all // `.all` is available when `AccessRange` conforms to `CaseIterable`
completeScope.isSuperset(of: postsScope) // -> true
Scope
也能够生成“scope string”(范围字符串),因为这通常是它们提供给 API 的方式。“scope string”包含所有访问范围(确切地说是它们的 rawValue
),并以空格分隔。重要的是要注意,Scope
不会按给定顺序保留访问范围。这意味着,不能保证两次调用 scopeString
会包含相同顺序的访问范围。但是,可以保证结果范围包含所有访问范围。Scope
当然也可以从范围字符串创建。如果任何包含的访问范围无效,此初始化器将抛出错误。
let usersScope: Scope<MyAccessRange> = [.readUsers, .writeUsers]
let string = usersScope.scopeString // -> "users:read users:write" OR "users:write users:read"
let recreatedScope = try Scope<MyAccessRange>(scopeString: string)
usersScope == recreatedScope // true
Scope
也是 Codable
,并将自身编码/解码为其范围字符串。
最后但并非最不重要的一点是,Scope
还提供了一些有用的正则表达式模式,可用于在字符串基础上执行匹配。如果您的范围以 Swift 类型提供,则不建议这样做,但如果您必须在数据库等中匹配范围,则可能很有用。目前提供了三种正则表达式模式
exactMatchRegexPattern
:返回一个模式,该模式匹配包含完全相同的访问范围的范围字符串。不多也不少。containsAllRegexPattern
:返回一个模式,该模式匹配包含所有访问范围的范围字符串,但允许包含更多。containsAnyRegexPattern
:返回一个模式,该模式匹配包含任何访问范围的范围字符串。只要包含一个访问范围,就会进行匹配。对于所有这些模式,Regex
也可用。
API 使用 header doc 进行文档化。如果您希望以网页形式查看文档,则有在线版本供您使用。
如果您发现错误/希望在 AuthScope 中看到新功能,有几种方法可以提供帮助
请参阅 LICENSE 文件。