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

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

Примеры: защита Enterprise-бинов

В следующих примерах показано, как защитить Enterprise-бины с помощью декларативной и программной безопасности.

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

Пример cart-secure: декларативная защита Enterprise-бина

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

Если тема аутентификации является новой для вас, см. Указание механизмов аутентификации.

В этом примере демонстрируется безопасность для уже имеющегося незащищённого приложения EJB cart, которое находится в tut-install/examples/ejb/cart/ и обсуждалось в Примере cart.

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

  1. Создайте приложение наподобие Пример cart. Начнём с этого примера и продемонстрируем добавление базовой аутентификации клиента в приложение. Приложение, обсуждаемого в этом разделе, можно найти в каталоге tut-install/examples/security/cart-secure/.

  2. Если вы ещё этого не сделали, выполните действия, описанные в Настройка системы для запуска примеров безопасности.

  3. Измените исходный код Enterprise-бина CartBean.java, чтобы указать, каким ролям и к каким защищённым методам разрешён доступ. Этот шаг обсуждается в Аннотируем бин.

  4. Соберите, упакуйте и разверните Enterprise-бин. Затем создайте и запустите клиентское приложение, следуя инструкциям в Запуск примера cart-secure с IDE NetBeans или Запуск примера cart-secure с помощью Maven.

Аннотируем бин

Исходный код приложения cart был изменён, как показано в следующем фрагменте кода (изменения выделены жирным шрифтом). Полученный файл можно найти в файле tut-install/examples/security/cart-secure/cart-secure-ejb/src/main/java/javaeetutorial/cart/ejb/CartBean.java.

Фрагмент кода выглядит следующим образом:

package javaeetutorial.cartsecure.ejb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javaeetutorial.cart.util.BookException;
import javaeetutorial.cart.util.IdVerifier;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;

@Stateful
@DeclareRoles("TutorialUser")
public class CartBean implements Cart, Serializable {
    List<String> contents;
    String customerId;
    String customerName;

    @Override
    public void initialize(String person) throws BookException {
        if (person == null) {
            throw new BookException("Null person not allowed.");
        } else {
            customerName = person;
        }

        customerId = "0";
        contents = new ArrayList<>();
    }

    @Override
    public void initialize(String person, String id) throws BookException {
        if (person == null) {
            throw new BookException("Null person not allowed.");
        } else {
            customerName = person;
        }

        IdVerifier idChecker = new IdVerifier();

        if (idChecker.validate(id)) {
            customerId = id;
        } else {
            throw new BookException("Invalid id: " + id);
        }

        contents = new ArrayList<>();
    }

    @Override
    @RolesAllowed("TutorialUser")
    public void addBook(String title) {
        contents.add(title);
    }

    @Override
    @RolesAllowed("TutorialUser")
    public void removeBook(String title) throws BookException {
        boolean result = contents.remove(title);

        if (result == false) {
            throw new BookException("\"" + title + "\" not in cart.");
        }
    }

    @Override
    @RolesAllowed("TutorialUser")
    public List<String> getContents() {
        return contents;
    }

    @Override
    @Remove()
    @RolesAllowed("TutorialUser")
    public void remove() {
        contents = null;
    }
}

Аннотация @RolesAllowed указывается на методах, доступ к которым вы хотите защитить. В этом примере только пользователям роли TutorialUser будет разрешено добавлять и удалять книги из корзины и выводить содержимое корзины. Аннотация @RolesAllowed неявно объявляет роль, на которую будет ссылаться в приложении. Следовательно, аннотация @DeclareRoles не требуется. Наличие аннотации @RolesAllowed также неявно заявляет, что для доступа пользователей к этим методам потребуется аутентификация. Если в дескрипторе развёртывания не указан метод проверки подлинности, будет проводиться аутентификация по имени пользователя/паролю.

Запуск примера cart-secure с IDE NetBeans

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/security
  4. Выберите каталог cart-secure.

  5. Установите флажок Открыть требуемые проекты.

  6. Нажмите Открыть проект.

  7. На вкладке «Проекты» кликните правой кнопкой мыши проект cart-secure и выберите «Сборка».

    На этом этапе выполняется сборка и упаковка приложения в cart-secure.ear, расположенном в каталоге cart-secure-ear/target/, и развёртывание этого файла EAR в GlassFish Server, извлечение клиентских заглушек и запуск клиентского приложения.

  8. В диалоговом окне «Вход для пользователя:» введите имя и пароль пользователя области file, созданного на сервере GlassFish и назначенного группе TutorialUser. Затем нажмите ОК.

    Если введённые имя пользователя и пароль аутентифицированы, выходные данные клиентского приложения появятся на вкладке Вывод:

    ...
    Retrieving book title from cart: Infinite Jest
    Retrieving book title from cart: Bel Canto
    Retrieving book title from cart: Kafka on the Shore
    Removing "Gravity's Rainbow" from cart.
    Caught a BookException: "Gravity's Rainbow" not in cart.
    Java Result: 1
    ...

    Если имя пользователя и пароль не аутентифицированы, диалоговое окно появляется снова, пока не будут введены корректные значения.

Запуск примера cart-secure с помощью Maven

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В окне терминала перейдите в:

    tut-install/examples/security/cart-secure/
  3. Чтобы собрать приложение, упаковать его в файл EAR в подкаталоге cart-secure-ear/target, развернуть его и запустить, введите следующую команду в окне терминала или командной строке:

    mvn install
  4. В диалоговом окне «Вход для пользователя:» введите имя и пароль пользователя области file, созданного на сервере GlassFish и назначенного группе TutorialUser. Затем нажмите ОК.

    Если введённые имя пользователя и пароль аутентифицированы, выходные данные клиентского приложения появятся на вкладке Вывод:

    ...
    Retrieving book title from cart: Infinite Jest
    Retrieving book title from cart: Bel Canto
    Retrieving book title from cart: Kafka on the Shore
    Removing "Gravity's Rainbow" from cart.
    Caught a BookException: "Gravity's Rainbow" not in cart.
    Java Result: 1
    ...

    Если имя пользователя и пароль не аутентифицированы, диалоговое окно появляется снова, пока не будут введены корректные значения.

Пример converter-secure: программная защита Enterprise-бина

В этом примере показано, как использовать методы getCallerPrincipal и isCallerInRole с Enterprise-бином. Этот пример берёт за основу очень простое приложение EJB, converter, и модифицирует методы ConverterBean, так что конвертация валюты будет происходить только тогда, когда запрашивающий субъект имеет роль TutorialUser.

Этот пример можно найти в каталоге tut-install/examples/security/converter-secure. За основу этого примера взято незащищённое приложение Enterprise-бина converter, которое обсуждается в главе 36 «Начало работы с Enterprise-бинами» и находится в tut-install/examples/ejb/converter/. Данный раздел добавляет в базовый пример необходимые элементы для защиты приложения с использованием методов getCallerPrincipal и isCallerInRole, которые более подробно обсуждаются в Защита Enterprise-бинов с использованием программной безопасности.

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

  1. Создайте простое приложение Enterprise-бина.

  2. Настройте пользователя на сервере GlassFish в области file, в группе TutorialUser и установите настройку "Назначение по умолчанию для ролей". Для этого выполните шаги, описанные в Настройка системы для запуска примеров безопасности.

  3. Измените бин, добавив методы getCallerPrincipal и isCallerInRole.

  4. Если приложение содержит веб-клиент, который является сервлетом, укажите защиту для сервлета, как описано в Указание безопасности для базовой аутентификации с использованием аннотаций.

  5. Соберите, упакуйте, разверните и запустите приложение.

Модификация ConverterBean

Исходный код для исходного класса ConverterBean был изменён, чтобы добавить предложение if..else, которое проверяет, имеет ли вызывающий субъект роль TutorialUser. Если пользователь имеет указанную роль, выполняется конвертация валюты и отображается рассчитанное значение. Если пользователь не имеет указанной роли, расчёт не выполняется, и приложение отображает 0. Пример кода можно найти в tut-install/examples/security/converter-secure/converter-secure-ejb/src/main/java/javaeetutorial/converter/ejb/ConverterBean.java.

Фрагмент кода выглядит следующим образом:

package javaeetutorial.convertersecure.ejb;

import java.math.BigDecimal;
import java.security.Principal;
import javax.ejb.Stateless;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;

@Stateless()
@DeclareRoles("TutorialUser")
public class ConverterBean{

    @Resource SessionContext ctx;
    private final BigDecimal yenRate = new BigDecimal("104.34");
    private final BigDecimal euroRate = new BigDecimal("0.007");

    @RolesAllowed("TutorialUser")
     public BigDecimal dollarToYen(BigDecimal dollars) {
        BigDecimal result = new BigDecimal("0.0");
        Principal callerPrincipal = ctx.getCallerPrincipal();
        if (ctx.isCallerInRole("TutorialUser")) {
            result = dollars.multiply(yenRate);
            return result.setScale(2, BigDecimal.ROUND_UP);
        } else {
            return result.setScale(2, BigDecimal.ROUND_UP);
        }
    }

    @RolesAllowed("TutorialUser")
    public BigDecimal yenToEuro(BigDecimal yen) {
        BigDecimal result = new BigDecimal("0.0");
        Principal callerPrincipal = ctx.getCallerPrincipal();
        if (ctx.isCallerInRole("TutorialUser")) {
             result = yen.multiply(euroRate);
             return result.setScale(2, BigDecimal.ROUND_UP);
        } else {
             return result.setScale(2, BigDecimal.ROUND_UP);
        }
    }
}

Модификация ConverterServlet

Следующие аннотации определяют настройки безопасности для ConverterServlet — веб-клиента converter:

@WebServlet(urlPatterns = {"/"})
@ServletSecurity(
@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL,
    rolesAllowed = {"TutorialUser"}))

Запуск converter-secure с IDE NetBeans

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/security
  4. Выберите каталог converter-secure.

  5. Нажмите Открыть проект.

  6. Кликните правой кнопкой мыши проект converter-secure и выберите Сборка.

    Эта команда собирает и развёртывает пример приложения в GlassFish Server.

Запуск converter-secure с использованием Maven

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В окне терминала перейдите в:

    tut-install/examples/security/converter-secure/
  3. Введите следующую команду:

    mvn install

    Эта команда собирает и упаковывает приложение в WAR-файл, converter-secure.war, который находится в каталоге target, и развёртывает WAR-файл.

Запуск converter-secure

  1. Откройте веб-браузер по следующему URL:

    http://localhost:8080/converter-secure

    Откроется диалоговое окно «Требуется аутентификация».

  2. Введите комбинацию имени пользователя и пароля, соответствующие пользователю, который уже был создан в области безопасности file GlassFish Server и был добавлен в группу TutorialUser, и нажмите ОК.

  3. Введите 100 в поле ввода и нажмите «Отправить».

    Появится вторая страница, показывающая преобразованные значения.


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