Попробуйте посмотреть библиотеку Грега Герена AuthKit . Это библиотека для Mac, которая включает Службы авторизации Mac OS X .
Вот пример:
import glguerin.authkit.*;
Privilege priv = new Privilege("system.privilege.admin");
Authorization auth = new MacOSXAuthorization();
try
{
// This will cause an authentication prompt to be
// shown to the user, requesting the "system.privilege.admin"
// privilege.
auth.authorize(priv, true);
// If we reach this point, we can execute privileged programs.
// Load the secured file.
Process proc = auth.execPrivileged(new String[] { "/bin/cat", "/root/securefile" });
InputStream inputStream = proc.getInputStream();
// Use standard I/O mechanisms to read the input.
}
catch (UnauthorizedCancellation e)
{
// User chose not to authorize the application.
// Handle appropriately.
}
Вызов auth.authorize()
вызовет стандартный диалог «Пожалуйста, введите ваш пароль, чтобы программа X могла вносить изменения». Пользователь может отменить при желании, вызывая бросок glguerin.authkit.UnauthorizedCancellation
.
![screen shot of Mac OS X authorization prompt](https://i.stack.imgur.com/RKwj3.png)
Это решение имеет огромное преимущество перед использованием sudo
или setuid
: оно только запускает необходимых задач от имени пользователя root.
Последнее замечание: загрузчик JNI по умолчанию для AuthKit использует мост Какао / Java, который был удален из Mac OS X со Snow Leopard. Таким образом, в последних версиях Mac OS X приведенный выше код завершится с UnsatisfiedLinkError
. Чтобы обойти это, используйте следующее:
// Put this class somewhere:
public class AuthKitLibLoader extends LibLoader
{
@Override
protected File makeFallbackDir()
{
return new File(".");
}
}
// Then, before calling AuthKit (using the above example), do this:
// Hook in our "Snow Leopard-safe" extension to AuthKit (see below).
System.setProperty("glguerin.util.LibLoader.imp", AuthKitLibLoader.class.getName());
Наконец, обязательно прочитайте документацию AuthKit для получения более подробной информации.