我想知道是否可以随着时间的推移保持获得的身份验证 这是我的代码:
- (IBAction)toggleAuthentification:(id)sender {
if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL) == errAuthorizationSuccess) {
AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
authRef = NULL;
AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
[sender setState:NSOffState];
} else if (AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL) == errAuthorizationSuccess) {
AuthorizationMakeExternalForm(authRef, &extAuthRef);
[sender setState:NSOnState];
NSDictionary *authRightInfo;
if (AuthorizationRightGet(authRights.items[0].name, (CFDictionaryRef *)&authRightInfo) == errAuthorizationSuccess) {
//[authRightInfo valueForKey:@"timeout"] == 300
keepAuthTimer = [NSTimer scheduledTimerWithTimeInterval:([[authRightInfo valueForKey:@"timeout"] unsignedShortValue] - 10) target:self selector:@selector(keepAuthentification:) userInfo:nil repeats:YES];
}
} else {
[sender setState:NSOffState];
}
}
- (void)keepAuthentification:(NSTimer *)aTimer {
NSLog(@"%d", AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags ^ kAuthorizationFlagInteractionAllowed, NULL));
NSLog(@"keepAuth", aTimer);
}
第1步:点击拨打toggleAuthentification:
并成功验证的按钮
第2步:290秒后我从控制台收到0
和keepAuth
,因此,我的NSTimer正常工作。
第3步:再等几秒钟(超过10秒)再次点击我的按钮。 Auth面板重新出现!
为什么我AuthorizationCopyRights
对keepAuthentification:
的调用不会重置300秒(对于此身份验证权限)超时?
我想要的是app,每个应用程序执行时只需记录一次,或者直到您通过单击按钮手动请求注销。
答案 0 :(得分:2)
在哪里记录,AuthorizationCopyRights
应该重置计时器? AuthorizationCopyRights
将从安全子系统请求所请求的权限,安全子系统将立即提供权限或提示用户进行授权。系统必须再次请求用户授权的秒数之后的超时在/etc/authorization
中配置,并且也可以设置为0,这意味着系统始终必须重新提示用户。
如果您希望将来多次使用授权权限运行具有root权限的工具(帮助工具),请执行以下操作:
当您需要首次使用root权限运行应用时,请要求用户授权。
授权成功后,不要直接启动helper-tool,而是启动具有root权限的helper-helper-tool。
helper-helper-tool在后台继续运行,直到您的应用程序告诉它退出,当您的应用程序本身要退出或用户取消授权时将会是什么情况。
helper-helper-tool通过某种IPC方法与您的应用程序通信。 E.g:
它从stdin读取命令 - 启动任务时,您可以访问其stdin管道(请参阅AuthorizationExecuteWithPrivileges的参数communicationsPipe
。
如果helper-helper-tool是用Obj-C编写的,你可以使用Distributed Objects。
如果它不是用Obj-C编写的,并且你不想因任何原因使用文件管道,你可能更喜欢使用UNIX套接字。 UNIX套接字的工作方式类似于网络套接字,但不使用网络协议或网络地址。这两个进程都打开一个服务器UNIX套接字,另一个进程创建一个客户端UNIX套接字并将其连接到服务器套接字。现在两个进程都可以通过该套接字交换数据(在两个方向上,因为套接字总是双向的)。
如果必须向helper-helper-tool发送大量数据,则上述所有方法都可能相当慢,因为它们涉及复制数据,甚至再次转换,复制和转换数据。在这种情况下,使用POSIX共享内存来传输数据(这是在进程之间传输数据的最快方式,因为数据根本没有传输,它只能同时用于多个进程)并且只使用任何一个以上方法通知其他进程内存内容已更新。
现在向helper-helper-tool发送一个命令,使其启动辅助工具(带有适当的参数)。由于helper-helper-tool以root身份运行,因此helper-tool也将以root身份运行。
由于helper-helper-tool保持活着状态,直到你告诉它退出,它总是可以在需要时启动辅助工具的另一个根实例。
对于您希望在没有root权限的情况下运行helper-tool的情况,只需直接调用它而不使用helper-helper-tool。
当然上面的方法过于复杂,但可能最容易采用当前的代码。我个人根本不会使用辅助工具,而是让辅助工具本身在后台永久运行。然后帮助工具将直接执行请求的操作,或者,如果由于某种原因无法执行,则自行分叉然后执行操作(如果您使用CoreFoundation,Foundation或某些其他Apple框架,这将无效)或自行执行然后使用一个参数重新执行自身,该参数告诉它只执行某个操作然后退出。优点是只有一个辅助工具。