我需要在我的应用程序中实现以下行为:当应用程序首次运行时,提示用户通过输入管理密码进行身份验证。身份验证成功后,使用 macOS 钥匙串访问安全地存储管理密码。对于同一命令的后续执行,从钥匙串中检索存储的密码并使用它来执行特权命令,而不需要用户再次输入管理密码。通过实施这种方法,用户只需要进行一次身份验证,并且特权命令的后续执行将是无缝的,而无需进一步的身份验证提示。 (我需要在我的应用程序中以编程方式执行一组 sudo。)
您能否确认为此目的在 macOS 应用程序开发中是否需要任何特定权利?此外,macOS 中是否有特定的服务可以促进此类实施?谢谢!
您需要使用
AuthorizationServices
或 SecurityFoundation
API 请求访问权限。这是使用 SFAuthorization
授权为管理员的简单示例:
import SecurityFoundation
func authorize() -> Bool {
guard let auth = SFAuthorization.authorization() as? SFAuthorization,
let admin = NSString(string: kAuthorizationRuleAuthenticateAsAdmin).utf8String
else {
// Authorization failed
return false
}
do {
try auth.obtain(withRight: admin, flags: [.interactionAllowed, .extendRights])
return true
} catch {
// Authorization failed
return false
}
}
// Usage
let admin = authorize()
print("Authorized:", admin)
请注意,如果您的应用程序是沙盒的,这将不起作用。
Apple 论坛上的这个帖子中有很多有关在 Swift 中使用授权 API 的讨论和示例:
https://forums.developer.apple.com/forums/thread/675712
SFAuthorization
(上面使用的)是一个更高级别的 API,但基于该 trhead,它似乎有其警告。该示例中的关键(kAuthorizationRuleAuthenticateAsAdmin
)是不是正确的名称,而是规则名称,这意味着它在某些授权方法中会失败。
另一方面,AuthorizationServices
要求您使用非 ARC 引用,这在 Swift 中有点令人畏惧,并且您需要一些 C 和内存管理知识。上面链接的线程还有 Quinn 的一个示例,用于在 Swift 中包装授权 API。
在 ARC 之前的 Objective C 中使用
SFAuthorization
的示例应用程序: