Как вызвать плагин авторизации Mac для разблокировки экрана блокировки после экранной заставки?

#macos #authentication #plugins #authorization

#macos #аутентификация #Плагины #авторизация

Вопрос:

Я пытаюсь отредактировать правила в auth.db, чтобы заставить плагин авторизации вызываться всякий раз, когда будет появляться окно входа в систему:

  1. После перезагрузки Mac
  2. После ручного выхода из системы
  3. При выходе из спящего режима
  4. После экранной заставки

Обоснование этого заключается в том, чтобы включить разблокировку / вход без того, чтобы пользователь вводил свой логин / пароль вручную.

Изменив правило system.login.console, я получил плагин авторизации, вызываемый для событий 1) и 2), но не для событий 3) и 4). Для 3) и 4) я попытался отредактировать правило system.login.screensaver несколькими способами, например:

 <dict>
    <key>class</key>
    <string>user</string>
    <key>mechanisms</key>
    <array>
        <string>NullAuthPlugin:invoke,privileged</string>
        <string>builtin:authenticate</string>
        <string>authinternal</string>
    </array>
    <key>group</key>
    <string>admin</string>
    <key>session-owner</key>
    <true/>
    <key>shared</key>
    <false/>
    <key>allow-root</key>
    <false/>
</dict>
  

Плагин вызывается 3) при пробуждении после сна, но не вызывается при событии 4) после экранной заставки.

Как я могу заставить плагин авторизации запускаться после экранной заставки?

Комментарии:

1. Можете ли вы описать, как вы редактировали правило system.login.screensaver?

Ответ №1:

Я тоже некоторое время боролся с этим (кстати, ваш вопрос мне очень помог, спасибо за это!)

Вот что сработало у меня:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>allow-root</key>
    <false/>
    <key>authenticate-user</key>
    <true/>
    <key>class</key>
    <string>user</string>
    <key>created</key>
    <real>426709293.721896</real>
    <key>group</key>
    <string>admin</string>
    <key>mechanisms</key>
    <array>
        <string>NameAndPassword:invoke</string>
        <string>builtin:policy-banner</string>
        <string>builtin:authenticate,privileged</string>
        <string>builtin:auto-login,privileged</string>
        <string>builtin:forward-login,privileged</string>
        <string>PKINITMechanism:auth,privileged</string>
    </array>
    <key>modified</key>
    <real>427141220.594918</real>
    <key>session-owner</key>
    <true/>
    <key>shared</key>
    <false/>
    <key>timeout</key>
    <integer>2147483647</integer>
    <key>tries</key>
    <integer>10000</integer>
    <key>version</key>
    <integer>0</integer>
</dict>
</plist>
  

ПРИМЕЧАНИЕ:
Я использовал имя и пароль Apple example, а не NullAuth, поэтому, если вы используете это с вашим NullAuth из вопроса, вам нужно будет это изменить.

Очевидно, что ваши временные метки и прочее также будут другими. У меня сработало со всеми 4 случаями, которые вы перечислили.

Я не уверен, были ли необходимы все эти механизмы, поэтому я, вероятно, исправлю это в будущем, но пока это работает.

Комментарии:

1. Большое вам спасибо за ваш ответ! Я думал, никто не собирается отвечать… Но как вам удалось разрешить пользователю не вводить пароль и вводить вручную с помощью плагина NameAndPassword?

2. Я немного изменил код. Пароль должен откуда-то взяться, эта часть действительно зависит от реализации. Что касается меня, я просто жестко запрограммировал свое имя пользователя / пароль, потому что целью моего прототипа было обеспечить возможность создания пользовательского интерфейса для ввода паролей для Mac. Вы можете попробовать получить доступ к локальной базе данных с информацией или даже попытаться разблокировать с помощью учетных данных, хранящихся на сервере, просто пара идей, которые приходят мне в голову. Очевидно, что здесь много проблем с безопасностью, и с ними нужно быть осторожным.

3. Я думал о возможности аутентификации пользователя без пароля (например, с помощью сканера отпечатков пальцев, например). Возможно, мне также придется хранить пароли в этом случае…

4. Имя и пароль работали для меня с правилом system.login.screensaver, которое вы опубликовали. Вы уверены, что не изменили другие правила в базе данных авторизации при экспериментировании с плагинами? Я получал неожиданные эффекты при настройке правил аутентификации и аутентификации владельца сеанса или администратора.

5. @fjlksahfob, я рекомендую вам удалить builtin:policy-banner из system.login.screensaver множества механизмов. В ходе моего тестирования я создал баннер политики , который успешно отображается при входе в OS X. Однако при system.login.screensaver вызове builtin:policy-banner создаваемое им окно становится невидимым; опытные пользователи могут нажать клавишу return, чтобы закрыть его, но другие просто видят Mac, который застрял, отображая черный экран.