Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Работа с областями безопасности, пользователями, группами и ролями

Часто требуется защита ресурсов с предоставлением доступа только авторизованным пользователям. См. Характеристики безопасности приложений для ознакомления с понятиями аутентификации, идентификации и авторизации.

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

  1. Разработчик приложения пишет код для запроса имени пользователя и пароля. Различные методы аутентификации обсуждаются в Указание механизмов аутентификации.

  2. Разработчик приложения сообщает, как настроить безопасность для развёрнутого приложения, используя аннотации метаданных или дескриптор развёртывания. Этот шаг обсуждается в Настройка ролей безопасности.

  3. Администратор сервера устанавливает авторизованных пользователей и группы в GlassFish Server. Это обсуждается в Управление пользователями и группами в GlassFish Server.

  4. Разработчик приложения назначает роли безопасности приложения пользователям, группам и принципалам, определённым в GlassFish Server. Эта тема обсуждается в Назначение ролей пользователям и группам.

Примечание:

По умолчанию имена участников группы назначаются одноименным ролям.

Что такое области безопасности, пользователи, группы и роли?

Область безопасности — это домен политики безопасности, определённый для веб-сервера или сервера приложений. Область содержит список пользователей, которым может быть назначена (или не может быть назначена) группа. Управление пользователями в GlassFish Server обсуждается в разделе Управление пользователями и группами в GlassFish Server.

Приложение часто запрашивает имя пользователя и пароль, прежде чем разрешить доступ к защищённому ресурсу. После ввода имени пользователя и пароля эта информация передаётся на сервер, который либо аутентифицирует пользователя и отправляет защищённый ресурс, либо не аутентифицирует пользователя, и в этом случае доступ к защищённому ресурсу запрещается. Этот тип аутентификации пользователя обсуждается в Указание механизма аутентификации в дескрипторе развёртывания.

В некоторых приложениях авторизованным пользователям назначаются роли. В этом случае роль, назначенная пользователю в приложении, должна быть назначена принципалу или группе, определённым на сервере приложений. Рисунок 50-6 показывает это. Дополнительную информацию о назначении ролей пользователям и группам можно найти в Настройка ролей безопасности.

Рисунок 50-6. Назначение ролей пользователям и группам

Схема назначения ролей, показывающая создание пользователей и групп, определение ролей и назначение ролей пользователям и группам

В следующих разделах представлена ​​дополнительная информация об областях безопасности, пользователях, группах и ролях.

Что такое область безопасности?

Защищённые ресурсы на сервере могут быть сгруппированы в наборы защищённых пространств, каждое со своей собственной схемой аутентификации и/или базой данных авторизации, содержащей коллекцию пользователей и групп. Область безопасности — это полная база данных пользователей и групп, определённых как корректные пользователи одного или нескольких приложений и управляемые одной и той же политикой аутентификации.

Сервис аутентификации сервера Java EE может управлять пользователями нескольких областей. Области file, admin-realm и attribute предустановлены для сервера GlassFish.

В области file сервер хранит учётные данные пользователя локально в файле с именем keyfile. Вы можете использовать Консоль администрирования для управления пользователями в области file. При использовании области file служба проверки подлинности сервера проверяет подлинность пользователя, проверяя область file. Эта область используется для аутентификации всех клиентов, кроме клиентов веб-браузера, которые используют HTTPS и сертификаты.

В области certificate сервер хранит учётные данные пользователя в базе данных сертификатов. При использовании области certificate сервер использует сертификаты с HTTPS для аутентификации веб-клиентов. Чтобы проверить личность пользователя в области certificate, сервис аутентификации проверяет сертификат X.509. Пошаговые инструкции по созданию сертификата этого типа см. в разделе Работа с цифровыми сертификатами. Поле общего имени сертификата X.509 используется в качестве основного имени.

admin-realm также является областью file и хранит учётные данные пользователя администратора локально в файле с именем admin-keyfile. Вы можете использовать Консоль администрирования для управления пользователями в этой области так же, как вы управляете пользователями в области file. Для получения дополнительной информации см. Управление пользователями и группами в GlassFish Server.

Что такое пользователь?

Пользователь — это личность или идентификационная информация прикладной программы, определённая в GlassFish Server. В веб-приложении пользователь может связать с этим идентификатором набор ролей, которые дают пользователю доступ ко всем ресурсам, защищённым этими ролями. Пользователи могут быть связаны с группой.

Пользователь Java EE похож на пользователя операционной системы. Как правило, оба типа пользователей представляют людей. Однако эти два типа пользователей не одинаковы. Сервис аутентификации сервера Java EE не знает имени пользователя и пароля, которые вы указываете при входе в операционную систему. Сервис аутентификации сервера Java EE не подключён к механизму безопасности операционной системы. Эти сервисы безопасности управляют пользователями, принадлежащими к разным областям безопасности.

Что такое группа?

Группа — это набор аутентифицированных пользователей, классифицированных по общим признакам, определённым в GlassFish Server. Пользователь Java EE из области file может входить в группу GlassFish Server. (Пользователь в области certificate не может.) Группа в GlassFish Server — это категория пользователей, классифицированных по общим признакам, таким как должность или профиль клиента. Например, большинство клиентских приложений электронной коммерции могут принадлежать к группе CUSTOMER, но крупные клиенты будут принадлежать к группе PREFERRED. Распределение пользователей по группам упрощает контроль доступа большого количества пользователей.

Группа в GlassFish Server отличается от области видимости. Группа предназначена для всего сервера GlassFish, тогда как роль связана только с конкретным приложением в GlassFish Server.

Что такое роль?

Роль — это абстрактное имя для разрешения доступа к определённому набору ресурсов в приложении. Роль можно сравнить с ключом, который может открыть замок. У многих людей может быть копия ключа. Замок не заботится о том, кто вы, только о том, что у вас есть правильный ключ.

Некоторая другая терминология

Следующая терминология также используется для описания требований безопасности платформы Java EE.

  • Принципал — это субъект, который может быть аутентифицирован с помощью протокола аутентификации в сервисе безопасности, развёрнутом на предприятии. Принципал идентифицируется по имени субъекта и аутентифицируется с использованием данных аутентификации.

  • Домен политики безопасности, также известный как домен безопасности или область безопасности, является областью, в которой общая политика безопасности определяется и применяется администратором безопасности сервиса безопасности.

  • Атрибуты безопасности — это набор атрибутов, связанных с каждым принципалом. Атрибуты безопасности имеют много применений: например, доступ к защищённым ресурсам и аудит пользователей. Атрибуты безопасности могут быть связаны с принципалом по протоколу аутентификации.

  • Учётные данные — это объект, который содержит или ссылается на атрибуты безопасности, используемые для аутентификации принципала для сервисов Java EE. Принципал получает учётные данные после аутентификации или от другого принципала, который позволяет использовать его учётные данные.

Управление пользователями и группами на сервере GlassFish

Выполните следующие шаги для управления пользователями, прежде чем запускать учебные примеры.

Здесь рассматриваются следующие темы:

Добавление пользователей в GlassFish Server

  1. Запустите GlassFish Server, если вы этого ещё не сделали.

    Информация о запуске сервера GlassFish доступна в разделе Запуск и остановка сервера GlassFish.

  2. Запустите Консоль администрирования, если вы этого ещё не сделали.

    Чтобы запустить Консоль администрирования, откройте веб-браузер и укажите URL http://localhost:4848/. Если вы изменили порт администратора по умолчанию во время установки, введите корректный номер порта вместо 4848.

  3. В дереве навигации разверните узел Конфигурации, затем разверните узел server-config.

  4. Разверните узел безопасности.

  5. Разверните узел Realms.

  6. Выберите область, в которую вы добавляете пользователей.

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

      В качестве примера приложений безопасности выберите область file.

    • Выберите admin-realm, чтобы добавить пользователей, которых вы хотите дабавить в качестве системных администраторов сервера GlassFish.

      Вы не можете добавлять пользователей в область certificate с помощью Консоли администрирования. В область certificate вы можете добавлять только сертификаты. Информацию о добавлении (импорте) сертификатов в область certificate см. в разделе Добавление пользователей в область безопасности сertificate.

  7. На странице «Изменить область» нажмите «Управление пользователями».

  8. На странице «Пользователи File» или «Администраторы» нажмите «Создать», чтобы добавить нового пользователя в область.

  9. На странице «Новый пользователь области File» введите значения в поля «ID пользователя», «Список групп», «Новый пароль» и «Подтверждение нового пароля».

    Для области администратора поле списка групп доступно только для чтения, а имя группы — asadmin. Перезапустите сервер GlassFish и консоль администрирования после добавления пользователя в область администратора.

    Для получения дополнительной информации об этих свойствах см. Работа с сферами, пользователями, группами и ролями.

    Для примеров приложений безопасности укажите пользователя с любым именем и паролем, которые вам нравятся, но убедитесь, что пользователь назначен группе TutorialUser. Имя пользователя и пароль чувствительны к регистру. Сохраните запись имени пользователя и пароля для работы с примерами, приведёнными далее в этом руководстве.

  10. Нажмите OK, чтобы добавить этого пользователя в область, или нажмите Отмена, чтобы выйти без сохранения.

Настройка ролей безопасности

Когда вы разрабатываете Enterprise-бин или веб-компонент, вы всегда должны думать о том, какие пользователи будут иметь доступ к компоненту. Например, веб-приложение для отдела кадров может иметь разные URL запроса для людей с ролями DEPT_ADMIN и DIRECTOR. Роль DEPT-ADMIN может позволять просматривать данные о сотрудниках, но роль DIRECTOR позволяет изменять данные о сотрудниках, включая данные о зарплатах. Каждая из этих ролей безопасности представляет собой абстрактную логическую группу пользователей, которая определяется человеком, компонующим приложение. При развёртывании приложения роли назначаются пользователям и группам, как показано на рис. 50-6.

Для компонентов Java EE вы определяете роли безопасности с помощью аннотаций @DeclareRoles и @RolesAllowed.

Ниже приведён пример приложения, в котором роль DEPT-ADMIN авторизована для методов, которые проверяют данные заработной платы сотрудников, а роль DIRECTOR авторизована для методов, которые изменяют данные заработной платы сотрудников.

Enterprise-бин будет аннотирован, как показано в следующем коде:

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
...
@DeclareRoles({"DEPT-ADMIN", "DIRECTOR"})
@Stateless public class PayrollBean implements Payroll {
    @Resource SessionContext ctx;


    @RolesAllowed("DEPT-ADMIN")
    public void reviewEmployeeInfo(EmplInfo info) {

        oldInfo = ... read from database;

        // ...
    }

    @RolesAllowed("DIRECTOR")
    public void updateEmployeeInfo(EmplInfo info) {

        newInfo = ... update database;

        // ...
    }
    ...
 }

Для сервлета вы можете использовать аннотацию @HttpConstraint в аннотации @ServletSecurity, чтобы указать роли, которым разрешён доступ к сервлету. Например, сервлет может быть аннотирован следующим образом:

@WebServlet(name = "PayrollServlet", urlPatterns = {"/payroll"})
@ServletSecurity(
@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL,
    rolesAllowed = {"DEPT-ADMIN", "DIRECTOR"}))
public class GreetingServlet extends HttpServlet {

После того, как пользователи предоставили свои регистрационные данные и в приложении было объявлено, какие роли авторизованы для доступа к защищённым частям приложения, следующим шагом будет назначение роли безопасности пользователю или принципалу.

Назначение ролей пользователям и группам

Когда вы разрабатываете приложение Java EE, вам не нужно знать, какие категории пользователей были определены для области безопасности, в которой будет запускаться приложение. В платформе Java EE архитектура безопасности предоставляет механизм назначения ролей, определённых в приложении, пользователям или группам, определённым в области безопасности среды выполнения.

Имена ролей, используемые в приложении, часто совпадают с именами групп, определённых на сервере GlassFish. API безопасности Java EE требует, чтобы принципалам назначались одноимённые роли. Соответственно, параметр Назначение по умолчанию для ролей включён по умолчанию на странице безопасности консоли администрирования сервера GlassFish. Все учебные примеры безопасности рассчитывают, что эта настройка включена. Если этот параметр включён, если имя группы, определённое на сервере GlassFish, совпадает с именем роли, определённым в приложении, нет необходимости использовать для назначения дескриптор развёртывания среды выполнения. Сервер приложений будет неявно выполнять это назначение для групп и ролей с совпадающими именами.

Если имена ролей, используемые в приложении, не совпадают с именами групп, определёнными на сервере, используйте дескриптор развёртывания среды выполнения, чтобы указать назначение. В следующем примере показано, как сделать назначение в файле glassfish-web.xml, который используется для веб-приложений:

<glassfish-web-app>
    ...
    <security-role-mapping>
        <role-name>Mascot</role-name>
        <principal-name>Duke</principal-name>
    </security-role-mapping>

    <security-role-mapping>
        <role-name>Admin</role-name>
        <group-name>Director</group-name>
    </security-role-mapping>
    ...
</glassfish-web-app>

Роль может быть назначена определённым принципалам и/или группам. Имена участников или групп должны быть корректными участниками или группами в текущей области безопасности по умолчанию или в области, указанной в элементе login-config. В этом примере роль Mascot, используемая в приложении, назначается принципалу Duke, который существует на сервере приложений. Назначение роли конкретному принципалу полезно, когда лицо, занимающее эту роль, может измениться. Для этого приложения вам нужно будет изменить только дескриптор развёртывания во время выполнения, а не искать и заменять во всём приложении ссылки на этот принципал.

Также в этом примере роль Admin назначена группе Director. Это полезно, потому что группа людей, которым разрешён доступ к административным данным на уровне директора, должна поддерживаться только на сервере GlassFish. Разработчику приложения не нужно знать, кто эти люди, а нужно лишь определить группу людей, которым будет предоставлен доступ к информации.

role-name должно соответствовать role-name в элементе security-role соответствующего дескриптора развёртывания или имени роли, определённой в аннотации @DeclareRoles.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)