授权

此软件包是 Authorization Services 框架中未弃用部分的完整 Swift 实现,主要包括:

  1. 通过 macOS 的安全服务器请求用户授予一项或多项权限
  2. 检查用户是否可以执行操作
  3. 在策略数据库中定义自定义权限

如果您希望使用 SMJobBless,请查看 Blessed。 您可能只需使用 Blessed 而不是此软件包,或者直接同时使用两者以获得更高级的用例。

定义自定义权限

macOS 的授权系统围绕权限的概念构建。 策略数据库包含系统中所有权限的定义,您的应用程序可以添加自己的权限。

如果应用程序定义了自己的权限,则可以使用这些权限来自我限制功能。 有关为什么您可能想要这样做,请考虑阅读 Apple 的 Technical Note TN2095: Authorization for Everyone,但请记住,如果您使用的是此 Swift 实现,则显示的示例代码不适用。

要定义自定义权限

let myCustomRight = AuthorizationRight(name: "com.example.MyApp.special-action")
let description = "MyApp would like to perform a special action."
let rules: Set<AuthorizationRightRule> = [CannedAuthorizationRightRules.authenticateAsAdmin]
try myCustomRight.createOrUpdateDefinition(rules: rules, descriptionKey: description)

上面的示例创建了一个名为“com.example.MyApp.special-action”的权限,该权限要求用户以管理员身份进行身份验证。 用户具体如何操作取决于 macOS; 您的应用程序不关心这一点。(在编写本文档时,这意味着用户需要输入密码,但在未来,Apple 可以例如更新其 authenticateAsAdmin 规则的实现以使用 Touch ID。)当要求用户进行身份验证时,他们将看到消息“MyApp would like to perform a special action.”

此示例中未使用几个可选参数,有关详细信息,请参阅文档。

如果您需要创建的规则并非完全由现有规则组成,则必须创建授权插件,此框架未涵盖该插件。 有关更多信息,请参阅 Using Authorization Plug-ins

授权

在某些更高级的情况下,您可能希望通过 Authorization 类直接与 macOS 的安全服务器进行交互。

如果您只需要检查用户是否可以执行操作,请使用 Authorization.checkRights(_:environment:options:),它不涉及创建 Authorization 实例。

否则,您通常需要通过 Authorization.init() 初始化一个实例,然后使用 Authorization.requestRights(_:environment:options:) 随后请求权限。

Authorization 符合 Codable 协议,因此可以序列化和反序列化,以便在进程之间方便地传输。

最终,AuthorizationAuthorizationRef 的包装器,因此如果需要,可以通过 Authorization.authorizationRef 访问此底层引用。 但是,请注意此引用的生命周期与其包含的 Authorization 实例绑定。

沙盒

由于权限提升,此框架的大部分适用于沙盒进程。 此规则的例外是在策略数据库中读取或存在性检查权限定义。