Spec-Zone .ru
спецификации, руководства, описания, API
|
Служба Аутентификации и авторизации Java (JAAS) была представлена как дополнительный пакет Java 2 SDK, Standard Edition (J2SDK), v 1.3. JAAS был интегрирован в Java Standard Edition Комплект разработчика, запускающийся с J2SDK 1.4.
JAAS может использоваться в двух целях:
Этот раздел обеспечивает основное учебное руководство для компонента аутентификации. Компонент авторизации будет описан в Учебном руководстве по Авторизации JAAS.
Аутентификация JAAS выполняется сменным способом. Это разрешает приложениям Java оставаться независимыми от базовых технологий аутентификации. Новые или обновленные технологии могут быть включены, не требуя модификаций к приложению непосредственно. Во время выполнения определяется реализация для определенной технологии аутентификации использоваться. Реализация определяется в конфигурационном файле входа в систему. Технология аутентификации, используемая для этого учебного руководства, является очень основной, только гарантируя, что пользователь определяет определенное имя и пароль.
Остальная часть этого учебного руководства состоит из следующих разделов:
Если Вы хотите сначала видеть учебный код в действии, можно пропустить непосредственно к Выполнению Кода и затем вернуться к другим разделам, чтобы узнать о кодировании и деталях конфигурационного файла.
Код для этого учебного руководства состоит из трех файлов:
Наш учебный код программы аутентификации содержится в единственном исходном файле, SampleAcn.java. Тот файл содержит два класса:
main
метод класса SampleAcn выполняет аутентификацию и затем сообщает действительно ли аутентификация, за которой следуют. Код для того, чтобы аутентифицировать пользователя очень прост, состоя только из двух шагов:
Сначала абсолютный код показывают, сопровождается полным списком SampleAcn
класс, завершитесь с оператором импорта, которого он требует и обработка ошибок.
Чтобы аутентифицировать пользователя, Вы сначала нуждаетесь в a javax.security.auth.login.LoginContext
. Вот основной способ инстанцировать LoginContext:
import javax.security.auth.login.*; . . . LoginContext lc = new LoginContext(<config file entry name>, <CallbackHandler to be used for user interaction>);и вот особенный метод, наш учебный код делает инстанцирование:
import javax.security.auth.login.*; . . . LoginContext lc = new LoginContext("Sample", new MyCallbackHandler());
Параметрами является следующее:
Это - имя для LoginContext, чтобы использовать, чтобы искать запись для этого приложения в конфигурационном файле входа в систему JAAS, описанном здесь. Такая запись определяет класс (ы), которые реализуют требуемую базовую технологию (и) аутентификации. Класс (ы) должен реализовать интерфейс LoginModule, который находится в javax.security.auth.spi
пакет.
В нашем примере кода мы используем SampleLoginModule
предоставленный этим учебным руководством. SampleLoginModule выполняет аутентификацию, гарантируя, что пользователь вводит определенное имя и пароль.
У записи в конфигурационном файле входа в систему, который мы используем для этого учебного руководства (см. sample_jaas.config) есть имя "Выборка", так, чтобы было имя, которое мы определяем как первый параметр конструктору LoginContext.
Когда LoginModule должен связаться с пользователем, например чтобы попросить имя пользователя и пароль, он не делает так непосредственно. Это - то, потому что есть различные способы связаться с пользователем, и это является требуемым для LoginModules, чтобы остаться независимым от различных типов взаимодействия с пользователем. Скорее LoginModule вызывает a
javax.security.auth.callback.CallbackHandler
выполнить взаимодействие с пользователем и получить требуемую информацию, такую как имя пользователя и пароль.
Экземпляр определенного CallbackHandler, который будет использоваться, определяется как второй параметр конструктору LoginContext. LoginContext вперед, что экземпляр к базовому LoginModule (в нашем случае SampleLoginModule). Приложение обычно обеспечивает свою собственную реализацию CallbackHandler. Двум простым CallbackHandlers, TextCallbackHandler и DialogCallbackHandler, предоставляют в com.sun.security.auth.callback
пакет как демонстрационные реализации. Для этого учебного руководства мы могли использовать TextCallbackHandler, который информация о выводах к и ввод чтений из командной строки. Однако, мы вместо этого демонстрируем более типичный случай приложения, обеспечивающего его собственную реализацию CallbackHandler, описанную в Классе MyCallbackHandler.
login
МетодКак только у нас есть LoginContext lc
, мы можем вызвать login
метод, чтобы выполнить процесс аутентификации:
lc.login();
LoginContext инстанцирует нового пустого javax.security.auth.Subject
объект (который представляет пользователя или аутентифицируемую службу). LoginContext создает сконфигурированный LoginModule (в нашем случае SampleLoginModule) и инициализирует это с этим новым Предметом и MyCallbackHandler.
LoginContext login
метод тогда вызывает методы в SampleLoginModule, чтобы выполнить вход в систему и аутентификацию. SampleLoginModule использует MyCallbackHandler, чтобы получить имя пользователя и пароль. Затем SampleLoginModule проверит, что имя и пароль - те, это ожидает.
Если аутентификация успешна, SampleLoginModule заполняет Предмет с Принципалом, представляющим пользователя. Принципал места SampleLoginModule в Предмете являются экземпляром SamplePrincipal, который является демонстрационным классом, реализовывая java.security. Основной интерфейс.
См. Предметы, Принципалы, Аутентификацию, и Учетные данные для информации на этих условиях.
Вызывающее приложение может впоследствии получить аутентифицируемый Предмет, вызывая LoginContext getSubject
метод, хотя делая так не необходим для этого учебного руководства.
SampleAcn
Код классаТеперь, когда Вы видели абсолютный код, требуемый аутентифицировать пользователя, мы можем соединить все это в полный класс в SampleAcn.java, который включает соответствующие операторы импорта и обработку ошибок:
package sample; import javax.security.auth.login.*; // . . . other import statements needed by MyCallbackHandler . . . /** * This Sample application attempts to authenticate a user * and reports whether or not the authentication was * successful. */ public class SampleAcn { /** * Attempt to authenticate the user. * * @param args input arguments for this application. * These are ignored. */ public static void main(String[] args) { // Obtain a LoginContext, needed for authentication. // Tell it to use the LoginModule implementation // specified by the entry named "Sample" in the // JAAS login configuration file and to also use the // specified CallbackHandler. LoginContext lc = null; try { lc = new LoginContext("Sample", new MyCallbackHandler()); } catch (LoginException le) { System.err.println("Cannot create LoginContext. " + le.getMessage()); System.exit(-1); } catch (SecurityException se) { System.err.println("Cannot create LoginContext. " + se.getMessage()); System.exit(-1); } // the user has 3 attempts to authenticate successfully int i; for (i = 0; i < 3; i++) { try { // attempt authentication lc.login(); // if we return with no exception, // authentication succeeded break; } catch (LoginException le) { System.err.println("Authentication failed:"); System.err.println(" " + le.getMessage()); try { Thread.currentThread().sleep(3000); } catch (Exception e) { // ignore } } } // did they fail three times? if (i == 3) { System.out.println("Sorry"); System.exit(-1); } System.out.println("Authentication succeeded!"); } }
В некоторых случаях LoginModule должен связаться с пользователем, чтобы получить информацию об аутентификации. LoginModules используют a
javax.security.auth.callback.CallbackHandler
с этой целью. Приложение может или использовать одну из демонстрационных реализаций, обеспеченных в com.sun.security.auth.callback
пакет или, более обычно, запись реализация CallbackHandler. Приложение передает CallbackHandler как параметр инстанцированию LoginContext. LoginContext вперед CallbackHandler непосредственно к базовому LoginModules.
Учебный пример кода предоставляет свою собственную реализацию CallbackHandler, класс MyCallbackHandler в SampleAcn.java.
CallbackHandler является интерфейсом с одним методом, чтобы реализовать:
void handle(Callback[] callbacks) throws java.io.IOException, UnsupportedCallbackException;
LoginModule передает метод дескриптора CallbackHandler массив соответствующих javax.security.auth.callback.Callback
s, например NameCallback для имени пользователя и PasswordCallback для пароля, и CallbackHandler выполняют требуемое взаимодействие с пользователем и устанавливают соответствующие значения в Обратных вызовах.
MyCallbackHandler handle
метод структурируется следующим образом:
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof TextOutputCallback) { // display a message according to a specified type . . . } else if (callbacks[i] instanceof NameCallback) { // prompt the user for a username . . . } else if (callbacks[i] instanceof PasswordCallback) { // prompt the user for a password . . . } else { throw new UnsupportedCallbackException (callbacks[i], "Unrecognized Callback"); } } }
CallbackHandler handle
метод передают массив экземпляров Обратного вызова, каждый определенный тип (NameCallback, PasswordCallback, и т.д.). Это должно обработать каждый Обратный вызов, выполняя взаимодействие с пользователем в пути, который является подходящим для выполняющегося приложения.
MyCallbackHandler обрабатывает три типа Обратных вызовов: NameCallback, чтобы запросить пользователя имя пользователя, PasswordCallback запрашивать пароль, и TextOutputCallback сообщать о любой ошибке, предупреждении, или других сообщениях SampleLoginModule хочет передаться пользователю.
handle
метод обрабатывает TextOutputCallback, извлекая сообщение, о котором сообщат и затем печатая его к System.out
, дополнительно предшествовавший дополнительной формулировкой, которая зависит от типа сообщения. Сообщение, о котором сообщат, определяется, вызывая TextOutputCallback getMessage
метод и тип, вызывая getMessageType
метод. Вот код для того, чтобы обработать TextOutputCallback:
if (callbacks[i] instanceof TextOutputCallback) { // display the message according to the specified type TextOutputCallback toc = (TextOutputCallback)callbacks[i]; switch (toc.getMessageType()) { case TextOutputCallback.INFORMATION: System.out.println(toc.getMessage()); break; case TextOutputCallback.ERROR: System.out.println("ERROR: " + toc.getMessage()); break; case TextOutputCallback.WARNING: System.out.println("WARNING: " + toc.getMessage()); break; default: throw new IOException("Unsupported message type: " + toc.getMessageType()); }
handle
метод обрабатывает NameCallback, запрашивая пользователя имя пользователя. Это делает это, печатая подсказку к System.err
. Это тогда определяет имя для использования SampleLoginModule, вызывая NameCallback setName
метод, передавая это имя вводил пользователем:
} else if (callbacks[i] instanceof NameCallback) { // prompt the user for a username NameCallback nc = (NameCallback)callbacks[i]; System.err.print(nc.getPrompt()); System.err.flush(); nc.setName((new BufferedReader (new InputStreamReader(System.in))).readLine());
Точно так же handle
метод обрабатывает PasswordCallback, печатая подсказку к System.err
запрашивать пользователя пароль. Это тогда устанавливает пароль для использования SampleLoginModule, вызывая PasswordCallback setPassword
метод, передавая это пароль, введенный пользователем, которого это читает, вызывая readPassword
метод (показанный ниже):
} else if (callbacks[i] instanceof PasswordCallback) { // prompt the user for sensitive information PasswordCallback pc = (PasswordCallback)callbacks[i]; System.err.print(pc.getPrompt()); System.err.flush(); pc.setPassword(readPassword(System.in));
readPassword
метод является основным методом для того, чтобы считать пароль из InputStream:
private char[] readPassword(InputStream in) throws IOException { char[] lineBuffer; char[] buf; int i; buf = lineBuffer = new char[128]; int room = buf.length; int offset = 0; int c; loop: while (true) { switch (c = in.read()) { case -1: case '\n': break loop; case '\r': int c2 = in.read(); if ((c2 != '\n') && (c2 != -1)) { if (!(in instanceof PushbackInputStream)) { in = new PushbackInputStream(in); } ((PushbackInputStream)in).unread(c2); } else break loop; default: if (--room < 0) { buf = new char[offset + 128]; room = buf.length - offset - 1; System.arraycopy(lineBuffer, 0, buf, 0, offset); Arrays.fill(lineBuffer, ' '); lineBuffer = buf; } buf[offset++] = (char) c; break; } } if (offset == 0) { return null; } char[] ret = new char[offset]; System.arraycopy(buf, 0, ret, 0, offset); Arrays.fill(buf, ' '); return ret; } }
SampleLoginModule.java реализует LoginModule
интерфейс. SampleLoginModule является классом, определенным конфигурационным файлом входа в систему учебного руководства как класс, реализовывая требуемую базовую аутентификацию. Пользовательская аутентификация SampleLoginModule состоит из простой проверки, что у имени и пароля, определенного пользователем, есть определенные значения. Этот SampleLoginModule определяется конфигурационным файлом входа в систему учебного руководства как LoginModule, чтобы использовать, потому что (1) Это выполняет основной тип аутентификации, подходящей для любой среды, и таким образом является подходящим для учебного руководства для всех пользователей, и (2) Это предоставляет пример реализация LoginModule опытным программистам, которые требуют возможности записать LoginModule, реализовывая технологию аутентификации.
SamplePrincipal.java является демонстрационным классом, реализовывая java.security. Основной интерфейс. Если аутентификация успешна, SampleLoginModule заполняет Предмет с SamplePrincipal, представляющим пользователя.
Важный: Если Вы - писатель приложения, Вы не должны знать, как записать LoginModule или Основную реализацию. Вы не должны исследовать код SampleLoginModule или SamplePrincipal. Все, что необходимо знать, - то, как записать Ваше приложение и определить конфигурационную информацию (такой как в конфигурационном файле входа в систему) так, что, приложение будет в состоянии использовать LoginModule, определенный конфигурацией, чтобы аутентифицировать пользователя. Вы должны определить, который LoginModule (s) Вы хотите использовать и считать документацию LoginModule, чтобы узнать о том, какие опции можно определить значения для (в конфигурации), чтобы управлять поведением LoginModule.
Любой поставщик может обеспечить реализацию LoginModule, которую можно использовать. Некоторые реализации предоставляются JRE от Sun Microsystems, как перечислено в документе Конфигурационного файла Входа в систему JAAS.
Информация для программистов, которые хотят записать LoginModule, может быть найдена в JAAS LoginModule
Руководство разработчика.
Аутентификация JAAS выполняется сменным способом, таким образом, приложения могут остаться независимыми от базовых технологий аутентификации. Системный администратор определяет технологии аутентификации, или LoginModules, чтобы использоваться для каждого приложения и конфигурирует их в Конфигурации входа в систему. Источник конфигурационной информации (например, файл или база данных) до тока javax.security.auth.login. Реализация конфигурации. Значение по умолчанию Configuration
реализация от Sun Microsystems читает конфигурационную информацию из конфигурационных файлов, как описано в com.sun.security.auth.login.ConfigFile.html.
См. Конфигурационный файл Входа в систему JAAS для информации относительно того, каков конфигурационный файл входа в систему, что это содержит, и как определить, какой конфигурационный файл входа в систему должен использоваться.
Как отмечено, конфигурационный файл входа в систему, который мы используем для этого учебного руководства, sample_jaas.config, содержит только одну запись, которая является
Sample { sample.module.SampleLoginModule required debug=true; };
Эту запись называют "Демонстрационной", и это - имя что наше учебное приложение, SampleAcn
, использование, чтобы обратиться к этой записи. Запись определяет, что LoginModule, который будет использоваться, чтобы сделать пользовательскую аутентификацию, является SampleLoginModule в sample.module
пакет и что этот SampleLoginModule обязан "успешно выполняться" для аутентификации, которую будут считать успешным. SampleLoginModule успешно выполняется, только если имя и пароль, предоставленное пользователем, является тем, которое это ожидает ("testUser" и "testPassword", соответственно).
SampleLoginModule также определяет опцию "отладки", которая может быть установлена в true
как показано. Если эта опция устанавливается в true,
Выводы SampleLoginModule дополнительная информация о продвижении аутентификации. LoginModule может определить так много опций, как он хочет. Документация LoginModule должна определить имена возможного варианта и значения, которые можно установить в своем конфигурационном файле.
Чтобы выполнить наш учебный код аутентификации JAAS, все, что необходимо сделать,
SampleAcn.java
, находятся в названном пакете sample
): sample.module
): sample.principal
): SampleAcn.java
, SampleLoginModule.java
, и SamplePrincipal.java
: javac sample/SampleAcn.java sample/module/SampleLoginModule.java sample/principal/SamplePrincipal.java(Введите все это на одной строке.)
SampleAcn
приложение, определяя -Djava.security.auth.login.config==sample_jaas.config
то, что конфигурационный файл входа в систему, который будет использоваться, sample_jaas.config
.Полная команда ниже.
java -Djava.security.auth.login.config==sample_jaas.config sample.SampleAcn
Вы будете запрошены Ваше имя пользователя и пароль, и SampleLoginModule, определенный в конфигурационном файле входа в систему, проверит, чтобы гарантировать, что они корректны. SampleLoginModule ожидает "testUser" для имени пользователя и "testPassword" для пароля.
Вы будете видеть некоторые сообщения, выведенные SampleLoginModule в результате debug
опция, устанавливаемая в true
в конфигурационном файле входа в систему. Затем, если Ваш вход в систему будет успешен, то Вы будете видеть следующее сообщение, выведенное SampleAcn:
Authentication succeeded!Если вход в систему не будет успешен (например, если Вы напишете пароль c орфографическими ошибками), то Вы будете видеть
Authentication failed:сопровождаемый причиной отказа. Например, если Вы вводите пароль с опечаткой, можно видеть сообщение как следующее:
Authentication failed: Password Incorrect
SampleAcn дает Вам три возможности успешно войти в систему.
Когда программа Java выполняется с установленным менеджером безопасности, программе не позволяют получить доступ к ресурсам или иначе выполнить секретные операции безопасности, если этому явно не предоставляют разрешение, чтобы сделать так политикой безопасности в действительности. В платформах Java, которые являются совместимыми с J2SE v 1.2 и позже, разрешение должна предоставить запись в файле политики.
Большинство браузеров устанавливает менеджера безопасности, таким образом, апплеты, обычно выполняемые под наблюдением менеджера безопасности. Приложения, с другой стороны, не делают, так как менеджер безопасности автоматически не устанавливается, когда приложение работает. Таким образом приложение, как наш SampleAcn
приложение, по умолчанию имеет полный доступ к ресурсам.
Чтобы запустить приложение с менеджером безопасности, просто вызовите интерпретатор с a -Djava.security.manager
параметр включается в командную строку.
Если Вы пытаетесь вызвать SampleAcn
с менеджером безопасности, но не определяя файла политики, Вы получите следующий (если у Вас не будет установки политики по умолчанию в другом месте, которая предоставляет необходимые полномочия или предоставления AllPermission
):
% java -Djava.security.manager \ -Djava.security.auth.login.config==sample_jaas.config sample.SampleAcn Exception in thread "main" java.security.AccessControlException: access denied ( javax.security.auth.AuthPermission createLoginContext.Sample)
Как можно видеть, Вы получаете AccessControlException, потому что мы не создали и использовали файл политики, предоставляющий наш код разрешение, которое требуется, чтобы разрешить создать LoginContext.
Вот полные шаги, требуемые, чтобы быть в состоянии выполнить наш SampleAcn
приложение с установленным менеджером безопасности. Можно пропустить первые пять шагов, если Вы уже сделали их, как описано в Выполнении Кода.
SampleAcn.java
, находятся в названном пакете sample
): sample.module
): sample.principal
): SampleAcn.java
, SampleLoginModule.java
, и SamplePrincipal.java
: javac sample/SampleAcn.java sample/module/SampleLoginModule.java sample/principal/SamplePrincipal.java(Введите все это на одной строке.)
SampleAcn.class
и MyCallbackHandler.class
: jar -cvf SampleAcn.jar sample/SampleAcn.class sample/MyCallbackHandler.class
(Введите все это на одной строке.) Эта команда создает файл JAR, SampleAcn.jar
, и места SampleAcn.class
и MyCallbackHandler.class
файлы в этом.
SampleLoginModule.class
и SamplePrincipal.class
: jar -cvf SampleLM.jar sample/module/SampleLoginModule.class sample/principal/SamplePrincipal.class
Разрешение, которое необходимо коду, пытающемуся инстанцировать LoginContext, является a javax.security.auth.AuthPermission
с целью "createLoginContext. <имя записи>". Здесь, <имя записи> обращается к имени записи конфигурационного файла входа в систему что ссылки приложения в его инстанцировании LoginContext. Имя, используемое нашим SampleAcn
инстанцирование LoginContext приложения является "Демонстрационным", как можно видеть в коде:
LoginContext lc = new LoginContext("Sample", new MyCallbackHandler());
Таким образом, разрешение, которому нужно предоставить SampleAcn.jar
permission javax.security.auth.AuthPermission "createLoginContext.Sample";
SampleLM.jar
файлу также нужно предоставить разрешение. Документация для LoginModule должна сказать Вам, какие полномочия ее нужно предоставить. В случае SampleLoginModule это нуждается в a javax.security.auth.AuthPermission
с целью "modifyPrincipals", чтобы заполнить Предмет с Принципалом:
permission javax.security.auth.AuthPermission "modifyPrincipals";
Скопируйте файл политики sampleacn.policy в тот же самый каталог как это, в котором Вы сохранили SampleAcn.java
, и т.д.. Файл политики содержит следующий grant
оператор, чтобы предоставить SampleAcn.jar
(в текущем каталоге) его необходимое разрешение:
grant codebase "file:./SampleAcn.jar" { permission javax.security.auth.AuthPermission "createLoginContext.Sample"; };
Файл политики также содержит следующий grant
оператор, чтобы предоставить SampleLM.jar
(также в текущем каталоге) его необходимое разрешение:
grant codebase "file:./SampleLM.jar" { permission javax.security.auth.AuthPermission "modifyPrincipals"; };
Отметьте: файлы Политики и структура записей в пределах них описываются в Синтаксисе Файла Реализации и Политики Политики По умолчанию. Полномочия описываются здесь.
SampleAcn
приложение, определяя -classpath
пункт, что классы должны разыскиваться в SampleAcn.jar
и SampleLM.jar
Файлы JAR,-Djava.security.manager
то, что менеджер безопасности должен быть установлен,-Djava.security.policy==sampleacn.policy
то, что файл политики, который будет использоваться, sampleacn.policy
, и-Djava.security.auth.login.config==sample_jaas.config
то, что конфигурационный файл входа в систему, который будет использоваться, sample_jaas.config
.Ниже полные команды, чтобы использовать и для Microsoft Windows и для систем Unix. Единственная разница - то, что на системах Microsoft Windows Вы используете точки с запятой, чтобы разделить элементы пути к классу, в то время как Вы используете двоеточия с этой целью на системах Unix.
Вот полная команда для систем Microsoft Windows:
java -classpath SampleAcn.jar;SampleLM.jar -Djava.security.manager -Djava.security.policy==sampleacn.policy \ -Djava.security.auth.login.config==sample_jaas.config \ sample.SampleAcn
Вот полная команда для систем UNIX:
java -classpath SampleAcn.jar:SampleLM.jar -Djava.security.manager -Djava.security.policy==sampleacn.policy \ -Djava.security.auth.login.config==sample_jaas.config \ sample.SampleAcn
Введите все это на одной строке. Многократные строки используются здесь для четкости. Если команда является слишком длинной для Вашей системы, Вы, возможно, должны поместить это в.bat файл (для Microsoft Windows) или.sh файл (для UNIX) и затем петлять, чтобы выполнить команду.
Так как указанный файл политики содержит запись, предоставляющую код необходимые полномочия, выполнение должно продолжиться без любых исключений, указывающих, что необходимое разрешение не предоставили. Вы будете запрошены имя пользователя, и пароль (используйте "testUser" и "testPassword"), и SampleLoginModule, определенный в конфигурационном файле входа в систему, проверит имя и пароль. Если Ваш вход в систему будет успешен, то Вы будете видеть сообщение "Аутентификация, за которой следуют!" и в противном случае Вы будете видеть "Отказавшую аутентификацию:" сопровождаемый причиной отказа.