Технические вопросы и ответы QA1172

Будьте осторожны при использовании AuthorizationCreate

Q: Он возможный использовать AuthorizationCreate создать AuthorizationRef, и одновременно, расширьте в настоящее время авторизованные права, все на одном шаге?

A: Да, это возможно, но необходимо быть осторожными. Если запрос на авторизацию отклонен, или сбои авторизации по некоторой другой причине, AuthorizationRef фактически не становится создаваемым, так использование его в последующих вызовах перестанет работать.

Лучший подход должен использовать AuthorizationCreate и передача NULL как начальная буква AuthorizationRights набор так, чтобы AuthorizationRef создается успешно, и затем более поздний вызов AuthorizationCopyRights определить или расширить допустимые права. Перечисление 1 иллюстрирует это.

Перечисление 1  Рекомендуемый способ использовать AuthorizationCreate.

OSStatus status;
AuthorizationRef authorizationRef;
AuthorizationItem right = { "com.mycompany.myapplication.command1", 0, NULL, 0 };
AuthorizationRights rightSet = { 1, &right };AuthorizationFlags flags = 
    kAuthorizationFlagExtendRights |
    kAuthorizationFlagInteractionAllowed;

/* Create a new AuthorizationRef object, but pass in NULL for the
AuthorizationRights set so the AuthorizationRef can be used in future calls. */

status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
    kAuthorizationFlagDefaults, &authorizationRef);
if (status == errAuthorizationSuccess)
{
    /* Now we can use the AuthorizationRef to deterimine if the user is
    allowed to perform the rights contained in "rightSet". */

    status = AuthorizationCopyRights(authorizationRef, &rightSet,
        kAuthorizationEmptyEnvironment, flags, NULL);
}


История версии документа


ДатаПримечания
26.07.2011

Переформатированное содержание и внесло незначительные редакционные изменения.

20.09.2002

Новый документ, объясняющий, почему необходимо избежать определять допустимые права при создании AuthorizationRef.